在tcp中检测客户端断开连接

时间:2014-01-07 04:29:48

标签: tcp

我正在使用tcp socket编写服务器/客户端应用程序,我的问题是如何检测半开连接,我打算使用keep-alive但有些人建议我自己做协议,所以我的计划现在是:

在服务器端:
服务器将等待10秒钟以便客户端发送一些数据,如果服务器在给定时间内没有收到来自客户端的任何消息,服务器会将客户端标记为已断开连接,否则,如果服务器从客户端它将再次重置计时器。

在客户端:
客户端将每隔10秒发送一次消息,但如果服务器从客户端请求一些数据(如果计数器在5秒钟内,并且客户端向服务器发送一些数据),则客户端中的计时器将再次重置为0。 / p>

简而言之,协议将在收到最后一条消息后从0到10进行计数,以使连接关闭。

现在我的问题是,这好吗?或者我做错了?还是一个坏主意?或者我会在客户端和服务器上遇到任何问题/错误?或者这个方法会阻止我的连接被防火墙,nat等阻止吗?

感谢。

2 个答案:

答案 0 :(得分:0)

您可以在套接字上设置超时,但最好实现自己的协议以保持活动状态。但是,您不需要自己维护计数器。此外,您最好将超时时间设置为保持活动时间间隔的两倍,因此如果超时为10秒,则应至少每5秒发送一次保持活动

答案 1 :(得分:0)

  

这样好吗?

  

或者我做错了?

是。您不需要维护自己的计时器,重置它等等。只需使用Socket.setSoTimeout().每次调用read()时它将自动从零重启,如果超时则抛出SocketTimeoutException到期。

  

或者这是一个坏主意?

这是一个好主意,但是当Socket已经支持它时,您正尝试执行自己的实现。

  

或者我会在客户端和服务器上遇到任何问题/错误吗?

当超时读取时,您将遇到SocketTimeoutException,如果这导致您关闭套接字,那么对套接字的任何后续发送最终都会得到IOException: connection reset,,您必须正确处理,即通过关闭该端口的套接字并忘记该对等体。

  

或者这个方法会阻止我的连接被防火墙,nat等阻止吗?

使用读取超时对防火墙或NAT没有其他影响。