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框架
- 长连接代替短连接
- 心跳机制保活