tcp的心跳检测 java 详细实例代码
时间: 2023-11-13 08:42:42 浏览: 48
当使用TCP协议进行网络通信时,心跳检测是一种常见的机制,用于检测连接是否仍然有效。下面是一个基于Java的TCP心跳检测的详细实例代码:
```java
import java.io.*;
import java.net.*;
import java.util.*;
public class TCPHeartbeat {
private static final int SERVER_PORT = 8888;
private static final int HEARTBEAT_INTERVAL = 5000; // 心跳间隔,单位为毫秒
private static final int HEARTBEAT_TIMEOUT = 15000; // 心跳超时时间,单位为毫秒
private static volatile boolean running = true;
public static void main(String[] args) {
startServer();
startClient();
}
private static void startServer() {
new Thread(() -> {
try {
ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
System.out.println("服务器已启动,等待客户端连接...");
while (running) {
Socket clientSocket = serverSocket.accept();
System.out.println("客户端已连接:" + clientSocket.getRemoteSocketAddress());
// 创建一个新线程处理客户端连接
new Thread(() -> {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
long lastHeartbeatTime = System.currentTimeMillis();
while (running) {
// 读取客户端发送的数据
String inputLine = in.readLine();
if (inputLine != null) {
System.out.println("客户端消息:" + inputLine);
// 向客户端发送响应数据
out.println("收到消息:" + inputLine);
}
long currentTime = System.currentTimeMillis();
if (currentTime - lastHeartbeatTime > HEARTBEAT_TIMEOUT) {
System.out.println("心跳超时,断开与客户端的连接:" + clientSocket.getRemoteSocketAddress());
break;
}
}
// 关闭连接
in.close();
out.close();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
private static void startClient() {
new Thread(() -> {
try {
Socket socket = new Socket("localhost", SERVER_PORT);
System.out.println("已连接到服务器:" + socket.getRemoteSocketAddress());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
Timer timer = new Timer();
// 发送心跳消息
TimerTask heartbeatTask = new TimerTask() {
@Override
public void run() {
out.println("Heartbeat");
}
};
// 监听心跳超时
TimerTask timeoutTask = new TimerTask() {
@Override
public void run() {
System.out.println("心跳超时,断开与服务器的连接:" + socket.getRemoteSocketAddress());
running = false;
timer.cancel();
}
};
timer.schedule(heartbeatTask, 0, HEARTBEAT_INTERVAL);
timer.schedule(timeoutTask, HEARTBEAT_TIMEOUT);
while (running) {
// 读取服务器的响应数据
String response = in.readLine();
if (response != null) {
System.out.println("服务器响应:" + response);
}
}
// 关闭连接
in.close();
out.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
```
以上代码中,我们使用了一个简单的心跳消息 "Heartbeat" 进行通信。服务器端会定时检测客户端的心跳时间,若超过设定的超时时间,就会断开与客户端的连接。客户端则会定时发送心跳消息,同时监听服务器的心跳超时。
希望这个示例代码能帮到你!如果还有其他问题,请随时提问。