Socket编程
flowchart TD
    Socket通信[Socket通信]
    Socket通信 --> TCP
    Socket通信 --> UDP
    Socket通信 --> NIO
    Socket通信 --> 多路复用
基础概念
核心API
// TCP服务端
ServerSocket serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();
// TCP客户端
Socket clientSocket = new Socket("127.0.0.1", 8080);
// UDP服务端
DatagramSocket serverSocket = new DatagramSocket(8080);
// UDP客户端
DatagramSocket clientSocket = new DatagramSocket();
 
TCP实现示例
// 服务端
try (ServerSocket server = new ServerSocket(8080);
     Socket socket = server.accept();
     BufferedReader in = new BufferedReader(
         new InputStreamReader(socket.getInputStream()));
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
    String request = in.readLine();
    out.println("响应: " + request);
}
// 客户端
try (Socket socket = new Socket("localhost", 8080);
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
     BufferedReader in = new BufferedReader(
         new InputStreamReader(socket.getInputStream()))) {
    out.println("请求数据");
    String response = in.readLine();
}
 
NIO模型
// 创建Selector
Selector selector = Selector.open();
// 注册Channel
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
// 事件循环
while (true) {
    selector.select();
    Set<SelectionKey> keys = selector.selectedKeys();
    for (SelectionKey key : keys) {
        if (key.isAcceptable()) {
            // 处理连接
        } else if (key.isReadable()) {
            // 处理读
        }
    }
    keys.clear();
}
 
性能优化
- 使用线程池处理连接
 
- 合理设置缓冲区大小
 
- 考虑使用Netty框架
 
- 长连接代替短连接
 
- 心跳机制保活