0

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

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

4

3 回答 3

2

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

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

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

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

于 2011-11-08T08:10:27.870 回答
0

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

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

于 2011-11-10T03:50:52.613 回答
0

设计并实现了故障关闭保活。这里重要的是在超时后关闭通道,然后重新打开它。

于 2011-11-15T18:23:33.167 回答