程序员社区

Socket通信过程和使用示例,教你轻松学会Socket编程

Socket通信过程和使用示例,教你轻松学会Socket编程插图
互联网通信

通信过程

  • 先启动Server端,设置一个循环用于一直监听端口是否有连接请求
  • 然后运行Client
  • Client端发出连接请求,Server端监听到这次请求后向客户端发回接受消息,连接建立,启动一个线程去处理这次请求,然后继续循环监听端口是否有连接请求

    • Client端输入字符串后点击回车键确认,向Server端发送数据
    • Server端读取数据后回复Client端数据
    • Server端对Client端请求处理完毕,启动的线程消亡
  • 如果Client端接收到 [处理成功] 之外的数据,会再次发送连接请求并发送数据 ,Server端会为这次连接再次启动一个线程连进行响应,直到Client端接收到的返回数据为 [处理成功]的数据时 ,Client端退出

Server端

  • Server端源代码:
public class Server {
    /** 监听的端口号 */
    public static final int PORT = 6688;

    public static void main(String[] args) {
        System.out.println("服务器Server端正在运行===");
        Server server = new Server();
        server.init();
    }

    public void init() {
        try {
            ServerSocket serverSocket = new ServerSocket(PORT);
            while (true) {
                /* 
                 * 一旦发生堵塞,则表示服务器Server端与客户端Client端获得了连接
                 */
                Socket client = serverSocket.accept();
                // 处理这次连接
                new HandlerThread(client);
            }
        } catch (Exception e) {
            Syste.out.println("服务器初始化异常:" + e.getMessage());
        }
    }

    /*
     * 处理客户端Client端Socket请求
     */
     private class HandlerThread implements Runnable {
        private Socket socket;

        public HandlerThread(Socket client) {
            socket = client;
            new Thread(this).start();
        }

        public void run() {
            try {
                /*
                 * 读取客户端数据
                 */
                DataInputStream input = new DataInputStream(socket.getInputStream());
                // 这里要注意服务器Server端的读方法要和客户端Client端的写方法对应,否则会抛出 EOFException
                String clientInputStr = input.readUTF();

                /*
                 * 服务器Server端对客户端Client端的数据进行处理
                 */ 
                 System.out.println("客户端发送的信息:" + clientInputStr);
                 // 向客户端Client端发送回复信息
                 DataOutputStream out = new DataOutputStream(socket.getOutputStream);
                 System.out.println("请输入:\t");
                 /*
                  * 发送键盘输入的一行
                  */
                  String s = new BufferedReader(new InputStreamReader(System.in)).readLine();
                  out.writeUTF(s);
                  out.close();
                  input.close();
            } catch (Exception e) {
                System.out.println("服务器运行异常:" + e.getMessage());    
            } finally {
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (Exception e) {
                        socket = null;
                        System.out.println("服务器socket异常:" + e.getMessage());
                    }
                }
            }
        }
     }
}

Client端

  • 客户端源代码:
public class client {
    /** 服务器地址 */
    public static final String IP_ADDR = "127.0.0.1";
    /** 服务器端口号 */
    public static final int PORT = 6688;

    public static void main(String[] args) {
        System.out.println("客户端启动===");
        System.out.println("当接收到服务器端字符为\"OK\"时,客户端将终止\n");
        while (true) {
            Socket socket = null;
            try {
                // 创建一个流套接字并连接到指定主机上的指定端口
                socket = new Socket(IP_ADDR, PORT);
                // 读取服务器端数据
                DataInputStream input = new DataInputStream(socket.getInputStream());
                // 向服务器端发送数据
                DataOutputStream output = new DataOutputStream(socket.getOutputStream());
                System.out.println("请输入:\t");
                String str = new BufferedReader(new InputStreamReader(System.in)).readLine();
                out.writeUTF(str);

                /*
                 * 接收服务端返回的信息
                 */
                 String ret = input.readUTF();
                 System.out.println("服务器返回的信息:" + ret);
                 // 如果接收的信息为"OK",则断开连接
                 if ("OK".equals(ret)) {
                    System.out.println("客户端将关闭连接===");
                    Thread.sleep(500);
                    break;
                 }
                 out.close();
                 input.close();
            } catch (Exception e) {
                System.out.println("客户端运行异常:" + e.getMessage());
            } finally {
                if (socket != null) {
                    socket.close();
                } catch (IOEXception e) {
                    socket = null;
                    System.out.println("客户端socket异常:" + e.getMessage());
                }
            }
        }
    }
}

注意点

  • Socket输出流写数据要和输入流读数据的方法要对应,否则会抛出EOFException异常:

    • 即Socket输出流写数据的方式是writeUTF() 时,输入流读数据方法就要使用readUTF()
赞(0) 打赏
未经允许不得转载:IDEA激活码 » Socket通信过程和使用示例,教你轻松学会Socket编程

一个分享Java & Python知识的社区