我正在使用tcp socket编写服务器/客户端应用程序,我的问题是如何检测半开连接,我打算使用keep-alive但有些人建议我自己做协议,所以我的计划现在是:
在服务器端:
服务器将等待10秒钟以便客户端发送一些数据,如果服务器在给定时间内没有收到来自客户端的任何消息,服务器会将客户端标记为已断开连接,否则,如果服务器从客户端它将再次重置计时器。
在客户端:
客户端将每隔10秒发送一次消息,但如果服务器从客户端请求一些数据(如果计数器在5秒钟内,并且客户端向服务器发送一些数据),则客户端中的计时器将再次重置为0。 / p>
简而言之,协议将在收到最后一条消息后从0到10进行计数,以使连接关闭。
现在我的问题是,这好吗?或者我做错了?还是一个坏主意?或者我会在客户端和服务器上遇到任何问题/错误?或者这个方法会阻止我的连接被防火墙,nat等阻止吗?
感谢。
答案 0 :(得分:0)
您可以在套接字上设置超时,但最好实现自己的协议以保持活动状态。但是,您不需要自己维护计数器。此外,您最好将超时时间设置为保持活动时间间隔的两倍,因此如果超时为10秒,则应至少每5秒发送一次保持活动
答案 1 :(得分:0)
这样好吗?
是
或者我做错了?
是。您不需要维护自己的计时器,重置它等等。只需使用Socket.setSoTimeout().
每次调用read()
时它将自动从零重启,如果超时则抛出SocketTimeoutException
到期。
或者这是一个坏主意?
这是一个好主意,但是当Socket
已经支持它时,您正尝试执行自己的实现。
或者我会在客户端和服务器上遇到任何问题/错误吗?
当超时读取时,您将遇到SocketTimeoutException
,如果这导致您关闭套接字,那么对套接字的任何后续发送最终都会得到IOException: connection reset,
,您必须正确处理,即通过关闭该端口的套接字并忘记该对等体。
或者这个方法会阻止我的连接被防火墙,nat等阻止吗?
使用读取超时对防火墙或NAT没有其他影响。