TCP保持活动状态以确定客户端是否在netty中断开连接

TCP保持活动状态以确定客户端是否在netty中断开连接,tcp,netty,Tcp,Netty,我试图确定客户端是否已关闭netty的套接字连接。有办法做到这一点吗?这取决于您在netty上使用的协议。如果您将其设计为支持类似ping的消息,则只需发送这些消息即可。除此之外,netty只是TCP的一个很薄的包装 另请参见其中描述的isOpen()和相关信息。但是,这并不能解决保持活动状态的问题。如果您正在编写服务器,而netty是您的客户机,那么您的服务器可以通过调用select()或等效程序来检测套接字何时可读,然后调用recv()来检测断开连接。如果recv()返回0,则客户端会优雅地

我试图确定客户端是否已关闭netty的套接字连接。有办法做到这一点吗?

这取决于您在netty上使用的协议。如果您将其设计为支持类似ping的消息,则只需发送这些消息即可。除此之外,netty只是TCP的一个很薄的包装


另请参见其中描述的
isOpen()
和相关信息。但是,这并不能解决保持活动状态的问题。

如果您正在编写服务器,而netty是您的客户机,那么您的服务器可以通过调用
select()
或等效程序来检测套接字何时可读,然后调用
recv()
来检测断开连接。如果
recv()
返回0,则客户端会优雅地关闭套接字。如果
recv()
返回-1,则检查实际错误的
errno
或等效项(除少数例外,大多数错误应视为不正常断开连接)。关于意外断开连接,操作系统可能需要很长时间才能检测到,因此您必须启用TCP保持有效,或者要求客户端定期向服务器发送数据。如果在一段时间内没有收到来自客户机的任何信息,那么只需假设客户机已离开并关闭连接端。如果客户端想重新连接,则可以重新连接。

如果从对等方关闭的连接中读取数据,则会得到某种类型的流结束指示,具体取决于API。如果您写入这样的连接,您将得到一个IOException:“连接重置”。TCP不提供任何其他检测关闭连接的方法


TCP保持活动(a)在默认情况下处于关闭状态,(b)在默认情况下仅在启用时每两小时运行一次。这可能不是你想要的。如果您使用它并且在检测到连接断开后读取或写入,您将得到上面的重置错误,

在通常情况下,客户端通过
close()
关闭套接字,并且TCP关闭握手已成功完成,则会出现
channelInactive()
(或
channelClosed()
在3中)事件将被触发

但是,在一个不寻常的情况下,例如客户机由于断电或LAN电缆拔出而脱机,这可能需要很多时间,直到您发现连接实际上已断开。要检测这种情况,您必须定期向客户机发送一些消息,并期望在一定时间内收到其响应。这就像一个ping-您应该在协议中定义一个周期性的ping和pong消息,它实际上除了检查连接的健康状况之外什么都不做

或者,您可以启用
以便_KEEPALIVE
,但此选项的KEEPALIVE间隔通常取决于操作系统,我不建议使用它


为了帮助用户相对容易地实现这种行为,Netty提供了
ReadTimeoutHandler
。配置管道,以便
ReadTimeoutHandler
在一定时间内没有入站流量时引发异常,并在
exceptionCaught()处理程序方法中关闭异常连接。如果您是定期发送ping消息的一方,请使用计时器(或
IdleStateHandler
)发送该消息。

该链接中的答案大多不正确。在SO中有更好的答案。@EJP您有链接吗?如果你能建议编辑,我很乐意接受!我的理解是tcp内置了keep alive。不可能利用这一点吗?是的,是的。TCP keep alive在默认情况下是禁用的,您只需在建立连接后打开它。我建议您链接到。我认为您误解了这个问题。他似乎在服务器中使用Netty。在Windows 2000及更高版本上,您可以使用
WSAIoctl(SIO\u KEEPALIVE\u VALS)
以编程方式在每个连接的基础上设置所需的TCP保持活动间隔。