我们有一个Java客户端服务器应用程序,其中包含使用TCP / IP的自定义协议。我们发现由于死套接字连接问题,有必要在协议中使用心跳。
我们从一开始就从客户端到服务器进行了心跳,服务器响应确认。
我们最近遇到了客户端超时问题,在分析完代码后,我提出了一些我不确定的问题。
1 - 心跳的最佳方向,我认为我们选择“客户端到服务器”,因为它占用了服务器的负载。 我正在考虑将其更改为“服务器到客户端”,但是我们可以控制客户端和服务器代码,因此我们不必担心浪费客户的时间。
2 - 是否有必要确认心跳以证明两个方向的连接是否存在?
非常感谢
答案 0 :(得分:0)
我认为任何一个方向的任何交通都应该足以让它保持活力,但用“乒乓”“ping”回应并没有什么坏处。传统上,客户端发送心跳,服务器将负责关闭无响应的客户端,以便您听起来正确。
您是否尝试将超时设置为零?可能是干扰套接字连接超时的网络设备吗?
try {
ServerSocket server = new ServerSocket(2048);
server.setSoTimeout(0); // never time out
try {
Socket s = server.accept( );
// handle the connection
// ...
}
catch (InterruptedIOException e) {
System.err.println("No connection within 30 seconds");
}
finally {
server.close( );
}
catch (IOException e) {
System.err.println("Unexpected IOException: " + e);
}