Delphi TidTCPClient在没有数据包通信的情况下保持与TidTCPServer的连接状态多长时间

Delphi TidTCPClient在没有数据包通信的情况下保持与TidTCPServer的连接状态多长时间,delphi,network-programming,indy,Delphi,Network Programming,Indy,我正在用Delphi中的Indy TCP组件制作一个服务器-客户端通信系统 一旦连接了客户端和服务器组件,如果长时间没有数据包通信,该连接可以保持多长时间 如果我的想法是错误的,那么是否需要任何信号包通信来防止断开连接?在TCP级别,建立连接后不需要发送数据包。如果您没有任何消息要发送,则不必发送任何消息。理论上,连接可以无限期地保持打开状态 然而,在实践中,可能存在影响空闲连接的网络级别要求(防火墙/路由器规则等)。为了解决这个问题,客户机和/或服务器应该定期告诉另一方,在空闲期间连接故意保持

我正在用Delphi中的Indy TCP组件制作一个服务器-客户端通信系统

一旦连接了客户端和服务器组件,如果长时间没有数据包通信,该连接可以保持多长时间


如果我的想法是错误的,那么是否需要任何信号包通信来防止断开连接?

在TCP级别,建立连接后不需要发送数据包。如果您没有任何消息要发送,则不必发送任何消息。理论上,连接可以无限期地保持打开状态

然而,在实践中,可能存在影响空闲连接的网络级别要求(防火墙/路由器规则等)。为了解决这个问题,客户机和/或服务器应该定期告诉另一方,在空闲期间连接故意保持打开状态(无论如何,这只是一种良好的通信设计)

您可以将显式消息添加到通信协议中,这只是您需要进行额外编码,以便根据需要在计时器上来回发送消息。如果您发送了一条消息,但在合理的时间内没有收到回复,您可以关闭两端的连接

如果您的协议不支持在应用程序级别添加此类消息,您也可以在TCP级别启用TCP自己的内置保持活动数据包。在这种情况下,任何一方(或最好双方)都可以在建立连接后调用
TIdTCPConnection.Socket.Binding.SetKeepAliveValues()
方法:

procedure SetKeepAliveValues(const AEnabled:Boolean;const ATimeMS,AInterval:Integer);
其中,
AEnabled
打开/关闭保持活动,
ATimeMS
是发送第一个保持活动数据包之前的空闲超时(以毫秒为单位),而
AInterval
是发送每个后续保持活动数据包之间的间隔(以毫秒为单位)


与任何其他TCP数据包一样,keep alives在TCP级别进行确认。因此,如果连接失效且未响应“保持有效”,操作系统将在一段时间后超时并为您关闭TCP连接。

谢谢,先生。这次你也给了我宝贵的回答。