使用TCP-Java套接字的心跳原型的良好超时

我在Java中实现我自己的proto,它将使用TCP连接的心跳,我也用它来传输消息和文件。 对于客户端,我使用阻塞套接字I / O. 所以这是我计划如何工作…我将设置套接字超时K秒并使心跳保持在间隔T发送消息,以便T <K。如果超时到期,看起来服务器离线对于客户,反之亦然。

心跳是发送字符串的服务器和客户端应答另一个字符串。

我不想浪费大量的带宽,但是如果超时,服务器可能会误认为客户的状态。

什么是良好的K区间? 我在想40秒

PS:字符串是ISO-8859-1中发送的8个字母,所以它的数据很小

“K”高度依赖于应用程序的特定流量配置文件(例如,应用程序数据传输的频率)以及应用程序对连接丢失的容忍度(例如,接收器检测连接丢失的速度有多快)。 不幸的是,低开销和快速检测是相反的目标。

这听起来像是你试图解决TCP半开连接问题(RFC 793的含义) 。 如果是这样,如果你不知道“半开放”一词,研究TCP“半开放”可能会指向一些有用的信息,如:

http://www.codeproject.com/Articles/37490/Detection-of-Half-Open-Dropped-TCP-IP-Socket-Conne.aspx

我不认为这里有一个通用的“正确”答案,它真的取决于你的需求。 您需要平衡带宽要求和服务认为客户端仍然存在的成本。 这些需求因应用而异。 对于IM,您可能想在几秒钟内知道,但对于文件传输应用程序,几分钟可能是可以接受的。