跳转至
用户认证 - eMac Tech Docs

用户认证

重要提醒

为了您的权益以及学习体验,请不要外借账号!

如果您没有账号或忘记密码,请联系管理员重置密码。

请输入您的登录信息

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

性能优化

  1. 使用线程池处理连接
  2. 合理设置缓冲区大小
  3. 考虑使用Netty框架
  4. 长连接代替短连接
  5. 心跳机制保活