当客户端在JBoss Netty中意外关闭时收到通知

时间:2011-11-08 05:00:29

标签: netty

在Netty服务器端是否有监听器,当客户端意外关闭时(例如当客户端m / c中的LAN电缆被移除时)将通知该监听器。 DefaultChannelHandler中的所有方法都不会被调用。在拔下LAN电缆时,假设客户端处于非活动状态(不发送/接收任何数据)。

或者我们是否必须在服务器端实现Keep-Alive监视器以检查通道是否有效?

3 个答案:

答案 0 :(得分:2)

实际上,无法检测TCP / IP中意外断开的连接。如果有办法做到这一点,就不应该“意外地”调用它。 : - )

检测断开连接的最有效方法是定期发送消息或等待超时消息,例如发送ping消息。

要实现此行为,您可以使用IdleStateHandler。将其插入您的管道并使您的处理程序扩展IdleStateAwareChannelHandlerIdleStateAwareChannelUpstreamHandler

或者,如果客户端和服务器在受控良好的网络(如LAN)中运行,则可以配置操作系统,以便更频繁地发送TCP保持活动数据包。有关更多信息,请参阅TCP keepalive HOWTO。但是,我怀疑这将在WAN环境下可靠地工作。 (如果有人在WAN环境中尝试过TCP keepalive超时,请分享您的故事。)

答案 1 :(得分:0)

您是否尝试在管道中添加ReadTimeoutHandler?我相信在服务器没有从通道读取给定秒数的数据后,这将抛出ReadTimeoutException

我只在客户端上使用它来实现重新连接(比如UpTime示例),但它也可以在这里工作。

答案 2 :(得分:0)

设计并实施失效关闭保持活动。这里重要的是在超时后关闭通道,然后重新打开它。