Z
ZHANK
网络编程

Socket 网络编程

学习 TCP Socket 通信、ServerSocket、多客户端处理

Socket 网络编程

Socket(套接字)是操作系统提供的网络通信端点。通过 Socket,两台机器上的程序可以像读写文件一样互相发送数据。

学完本章你将: 编写 TCP 服务端和客户端、处理多客户端连接。


TCP 通信模型

服务端(先启动)                      客户端
1. ServerSocket(8080) 监听端口
2. accept() 阻塞等待 ←─── 连接 ───→   Socket("host", 8080)
3. getInputStream() 收 ←── 数据 ───→  getOutputStream() 发
4. getOutputStream() 发 ───→ 回复 ←── getInputStream() 收
5. close()                             close()

服务端

java
try (ServerSocket server = new ServerSocket(8080)) {
    System.out.println("服务器启动,监听端口 8080");
    while (true) {
        Socket client = server.accept(); // 阻塞,直到有客户端连接
        System.out.println("新连接:" + client.getInetAddress());

        // 每个客户端一个线程,互不干扰
        new Thread(() -> handle(client)).start();
    }
}

客户端

java
try (Socket socket = new Socket("localhost", 8080)) {
    // 发数据 → 用 OutputStream
    PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
    writer.println("Hello, Server!");

    // 收数据 → 用 InputStream
    BufferedReader reader = new BufferedReader(
        new InputStreamReader(socket.getInputStream()));
    String response = reader.readLine();
    System.out.println("服务器回复:" + response);
}

处理函数 —— 回显服务

java
void handle(Socket client) {
    try (client; // try-with-resources 自动关闭
         BufferedReader reader = new BufferedReader(
             new InputStreamReader(client.getInputStream()));
         PrintWriter writer = new PrintWriter(
             client.getOutputStream(), true)) {

        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println("收到:" + line);
            writer.println("Echo: " + line); // 原样返回
        }
    } catch (IOException e) {
        System.err.println("连接异常:" + e.getMessage());
    }
}

💡 readLine() 是阻塞的: 客户端没发数据,服务端就卡在 readLine() 等。这是一个线程只能处理一个客户端的原因。


处理函数

java
void handle(Socket client) {
    try (client;
         BufferedReader reader = new BufferedReader(
             new InputStreamReader(client.getInputStream()));
         PrintWriter writer = new PrintWriter(
             client.getOutputStream(), true)) {

        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println("收到:" + line);
            writer.println("Echo: " + line); // 回显
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

TCP 通信流程

服务端                          客户端
  创建 ServerSocket(8080)
  ↓ accept() 等待
  收到连接  ←──── 连接建立 ────→  创建 Socket("host", 8080)
  读数据    ←──── 发送请求 ────→  写数据
  写数据    ────→ 回复响应 ←────  读数据
  关闭      ←──── 断开连接 ────→  关闭