我们有一个带有使用TCP/IP的自定义协议的Java客户机服务器应用程序。由于套接字连接失效,我们发现有必要在协议中使用心跳。
我们从一开始就有心跳从客户端到服务器,服务器响应一个确认。
我们最近遇到了客户端超时问题,在分析了代码后,我提出了几个我不确定的问题。
1 -什么方向是最好的心跳,我认为我们选择"客户端到服务器",因为它需要服务器的负载。我想把它改为"服务器到客户端",但是我们控制了客户端和服务器代码,所以我们不需要担心浪费客户端的时间。
2 -是否有必要确认心跳以证明连接在两个方向上都是有效的?
多谢
我认为任何方向的流量都应该足以让它保持活力,但用"pong"来回应"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);
}