【问题标题】:Getting notified when a client closes unexpectedly in JBoss Netty当客户端在 JBoss Netty 中意外关闭时收到通知
【发布时间】:2011-11-16 02:23:33
【问题描述】:

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

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

【问题讨论】:

    标签: netty


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢信任。将尝试上述行为。
    【解决方案2】:

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

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

    【讨论】:

    • 我在服务器中使用了 IdleStateHandler,并带有来自客户端的周期性 ping 机制。那行得通:)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 2016-04-04
      相关资源
      最近更新 更多