长连接是指网络连接建立后长期存在,用于实现服务端与客户端持续交互的连接。
实现长连接的主要方法有:
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、 持续数据交互:
- 服务端和客户端持续地相互通信,不断发送和接收数据。
- 如果在一定时间内无数据交互,则认为连接已断开。
这种方式无需额外的心跳机制或轮询,通过正常的数据通信就实现了长连接的效果。但是,如果长时间无数据交互,仍然需要关闭连接以避免资源浪费。