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

2021-09-02  本文已影响0人  攻城狮Chova
互联网通信

通信过程

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());
                }
            }
        }
    }
}

注意点

上一篇 下一篇

猜你喜欢

热点阅读