一旦建立连接,如果没有任何对等方发送任何数据,则不会在网络上发送任何数据包。TCP 是一种空闲协议,因此它假定连接仍然处于活动状态。
您可以尝试打开第二个连接并尝试连接,但这有一些缺点:您会消耗更多资源,创建新线程等。此外,如果对端已重启,第二个连接可以正常工作,但第一个则不行。
如果您尝试在半开连接上发送 ping 或任何消息,您会发现不会收到任何错误。
TCP 保活数据包本质上是一个 ACK,其序列号比当前连接序列号小 1。收到此类 ACK 的主机将以当前序列号的 ACK 作为响应。保活可用于验证连接远端的计算机是否仍然可用。若在 TCP 连接上没有其他数据或更高层级的保活传输,TCP 保活可每隔 TCPKeepAlive.Time(默认为 7,200,000 毫秒即两小时)发送一次。若保活无响应,则每隔 TCPKeepAlive.Interval 秒重试一次。KeepAliveInterval 默认为 1000 毫秒。
您可以启用每个连接的 KeepAlive,让 TCP 协议检查连接是否处于活跃状态。如果您想检测断开的连接(例如拔掉网线时),这是首选方法。
oClient := TsgcWebSocketClient.Create(nil);
oClient.TCPKeepAlive.Enabled := True;
oClient.TCPKeepAlive.Time := 5000;
oClient.TCPKeepAlive.Interval := 1000;