Socket如何实现长连接?代码举例讲解

长连接是指网络连接建立后长期存在,用于实现服务端与客户端持续交互的连接。

实现长连接的主要方法有:
1、 心跳机制:

  • 服务端和客户端定期发送空的消息来维持连接状态。
  • 如果在一定时间内未接收到心跳消息,则认为连接已断开。
// 服务端 
ServerSocket server = new ServerSocket(8000);
Socket socket = server.accept();

new Thread() {
    public void run() {
        while (true) {
            try {
                socket.getOutputStream().write("".getBytes());   // 发送心跳
                Thread.sleep(5000);   // 5s发送一次
            } catch (Exception e) {
                break;   // 连接已断开
            }
        }
    }
}.start();

// 客户端
Socket socket = new Socket("127.0.0.1", 8000);
InputStream in = socket.getInputStream();
while (true) {
    byte[] buffer = new byte[1024];
    int len = in.read(buffer);
    if (len == -1) {   // 5s未收到心跳,连接断开
        break;
    }
} 

2、 轮询:

  • 服务端和客户端定期发送请求和响应消息来维持连接。
  • 如果在一定时间内未收到请求/响应,则认为连接已断开。
// 服务端
ServerSocket server = new ServerSocket(8000);
Socket socket = server.accept();

while (true) {
    InputStream in = socket.getInputStream();
    byte[] buffer = new byte[1024];
    int len = in.read(buffer);  // 读取客户端请求
    if (len == -1) break;  

    OutputStream out = socket.getOutputStream();
    out.write("Response".getBytes());   // 发送响应
}

// 客户端  
Socket socket = new Socket("127.0.0.1", 8000);
OutputStream out = socket.getOutputStream();
while (true) {
    out.write("Request".getBytes());  // 发送请求
    InputStream in = socket.getInputStream();
    byte[] buffer = new byte[1024];
    int len = in.read(buffer);
    if (len == -1) break;  // 5s未收到响应,连接断开
}

3、 持续数据交互:

  • 服务端和客户端持续地相互通信,不断发送和接收数据。
  • 如果在一定时间内无数据交互,则认为连接已断开。

这种方式无需额外的心跳机制或轮询,通过正常的数据通信就实现了长连接的效果。但是,如果长时间无数据交互,仍然需要关闭连接以避免资源浪费。