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)
读数据 ←──── 发送请求 ────→ 写数据
写数据 ────→ 回复响应 ←──── 读数据
关闭 ←──── 断开连接 ────→ 关闭