网络编程系列教材 (二)- Java Socket 收发消息入门例子

 

使用 Socket(套接字)进行不同的程序之间的通信

步骤1:建立连接 
步骤2:收发数字
步骤3:收发字符串
步骤4:使用Scanner
步骤5:练习-服务端和客户端互聊
步骤6:答案-服务端和客户端互聊
步骤7:练习-聊天机器人数据库
步骤8:答案-聊天机器人数据库

步骤 1 : 建立连接 

1. 服务端开启8888端口,并监听着,时刻等待着客户端的连接请求 
2. 客户端知道服务端的ip地址和监听端口号,发出请求到服务端 
客户端的端口地址是系统分配的,通常都会大于1024 
一旦建立了连接,服务端会得到一个新的Socket对象,该对象负责与客户端进行通信。 
注意: 在开发调试的过程中,如果修改过了服务器Server代码,要关闭启动的Server,否则新的Server不能启动,因为8888端口被占用了

建立连接

package socket;

  

import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;

   

public class Server {

   

    public static void main(String[] args)  {

        try {

            //服务端打开端口8888

            ServerSocket ss = new ServerSocket(8888);

               

            //在8888端口上监听,看是否有连接请求过来

            System.out.println("监听在端口号:8888");

            Socket s =  ss.accept();

               

            System.out.println("有连接过来" + s);

             

            s.close();

            ss.close();

        catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

           

    }

}

package socket;

  

import java.io.IOException;

import java.net.Socket;

import java.net.UnknownHostException;

   

public class Client {

   

    public static void main(String[] args)  {

           

        try {

            //连接到本机的8888端口

            Socket s = new Socket("127.0.0.1",8888);

            System.out.println(s);

            s.close();

        catch (UnknownHostException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}

步骤 2 : 收发数字

一旦建立了连接,服务端和客户端就可以通过Socket进行通信了 
1. 客户端打开输出流,并发送数字 110 
2. 服务端打开输入流,接受数字 110,并打印

package socket;

 

import java.io.IOException;

import java.io.InputStream;

import java.net.ServerSocket;

import java.net.Socket;

 

public class Server {

 

    public static void main(String[] args) {

        try {

 

            ServerSocket ss = new ServerSocket(8888);

 

            System.out.println("监听在端口号:8888");

            Socket s = ss.accept();

 

            //打开输入流

            InputStream is = s.getInputStream();

 

            //读取客户端发送的数据

            int msg = is.read();

            //打印出来

            System.out.println(msg);

            is.close();

 

            s.close();

            ss.close();

        catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

 

    }

}

package socket;

 

import java.io.IOException;

import java.io.OutputStream;

import java.net.Socket;

import java.net.UnknownHostException;

 

public class Client {

 

    public static void main(String[] args) {

 

        try {

            Socket s = new Socket("127.0.0.1"8888);

 

            // 打开输出流

            OutputStream os = s.getOutputStream();

 

            // 发送数字110到服务端

            os.write(110);

            os.close();

 

            s.close();

        catch (UnknownHostException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}

步骤 3 : 收发字符串

直接使用字节流收发字符串比较麻烦,使用数据流对字节流进行封装,这样收发字符串就容易了 
1. 把输出流封装在DataOutputStream中 
使用writeUTF发送字符串 "Legendary!" 
2. 把输入流封装在DataInputStream 
使用readUTF读取字符串,并打印

package socket;

 

import java.io.DataInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.ServerSocket;

import java.net.Socket;

 

public class Server {

 

    public static void main(String[] args) {

        try {

 

            ServerSocket ss = new ServerSocket(8888);

 

            System.out.println("监听在端口号:8888");

            Socket s = ss.accept();

 

            InputStream is = s.getInputStream();

 

            //把输入流封装在DataInputStream

            DataInputStream dis = new DataInputStream(is);

            //使用readUTF读取字符串

            String msg = dis.readUTF();

            System.out.println(msg);

            dis.close();

            s.close();

            ss.close();

        catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

 

    }

}

package socket;

 

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.net.Socket;

import java.net.UnknownHostException;

import java.util.Scanner;

 

public class Client {

 

    public static void main(String[] args) {

 

        try {

            Socket s = new Socket("127.0.0.1"8888);

 

            OutputStream os = s.getOutputStream();

 

            //把输出流封装在DataOutputStream中

            DataOutputStream dos = new DataOutputStream(os);

            //使用writeUTF发送字符串

            dos.writeUTF("Legendary!");

            dos.close();

            s.close();

        catch (UnknownHostException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}

步骤 4 : 使用Scanner

在上个步骤中,每次要发不同的数据都需要修改代码 
可以使用Scanner读取控制台的输入,并发送到服务端,这样每次都可以发送不同的数据了。

package socket;

 

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.net.Socket;

import java.net.UnknownHostException;

import java.util.Scanner;

 

public class Client {

 

    public static void main(String[] args) {

 

        try {

            Socket s = new Socket("127.0.0.1"8888);

 

            OutputStream os = s.getOutputStream();

            DataOutputStream dos = new DataOutputStream(os);

             

            //使用Scanner读取控制台的输入,并发送到服务端

            Scanner sc = new Scanner(System.in);

             

            String str = sc.next();

            dos.writeUTF(str);

             

            dos.close();

            s.close();

        catch (UnknownHostException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}


更多内容,点击了解: https://how2j.cn/k/socket/socket-socket/400.html

posted @ 2020-03-27 09:24  Lan_ht2  阅读(101)  评论(0编辑  收藏  举报