netty 可以可靠地检测通道关闭/断开连接吗?

Posted

技术标签:

【中文标题】netty 可以可靠地检测通道关闭/断开连接吗?【英文标题】:can netty reliably detect channel close/disconnect? 【发布时间】:2012-04-03 06:44:47 【问题描述】:

特别是我对通道另一端意外死亡(例如进程被终止)的情况感兴趣。似乎 netty 不能可靠地触发通道关闭/断开连接事件,有时会,有时不会。它也不一定会为连接重置抛出 SocketException。

对于它的价值,我也尝试过写入频道,但这也可以继续工作而不会引发异常或触发任何其他事件。

我正在 Windows 上使用 netty 3.3.0.Final 对此进行测试,如果这有什么不同的话。

【问题讨论】:

【参考方案1】:

如果通道在没有发送关闭的情况下断开连接,则无法检测到它。通常,如果需要,检测断开连接的最佳方法是每隔 x 秒通过通道定期发送心跳事件。使用 IdleStateHandler,如果在心跳 + 增量后没有收到心跳,则强制断开通道。

【讨论】:

【参考方案2】:

尝试使用 ChannelInboundHandlerAdapter 类中的 channelUnregistered 方法。

public void channelUnregistered(ChannelHandlerContext ctx) throws Exception 
  ctx.fireChannelUnregistered();
  //Your logic goes here...

【讨论】:

以上是关于netty 可以可靠地检测通道关闭/断开连接吗?的主要内容,如果未能解决你的问题,请参考以下文章

Netty 不关闭频道

netty源码之断开连接

netty源码之断开连接

TCP-缓冲区和粘包、拆包有啥关系?

面试官:说说Netty断开连接的原理

Netty 中的心跳机制