【问题标题】:Netty SimpleChannelInboundHandler close channelNetty SimpleChannelInboundHandler 关闭通道
【发布时间】:2014-07-14 13:57:16
【问题描述】:

我有扩展 SimpleChannelInboundHandler 的处理程序。我用它来处理 websocket 帧。 检测从客户端关闭连接(浏览器关闭或网络连接崩溃)的最佳方法是什么? 我看到 ChannelInboundHandlerAdapter 中有两种方法:channelUnregistered 和 channelInactive。我可以用它来检测通道关闭吗?

【问题讨论】:

    标签: java websocket netty


    【解决方案1】:

    您应该使用channelInactive(),它在通道无法再进行通信时触发。 channelUnregistered() 有不同的含义,虽然channelUnregistered() 总是在channelInactive() 之后触发。

    【讨论】:

    • 我已经在我的处理程序中覆盖了 channelUnregistered 和 channelInactive。而且它们都不会被触发。可能是什么原因?
    • @ismailyavuz 可能是因为放置在您的处理程序之前的处理程序之一没有通过调用ctx.fireChannelInactive()ctx.fireChannelUnregistered() 转发事件?
    • 我的 initChannel 中只有这 4 个来添加管道。 1)DelimiterBasedFrameDecoder 作为成帧器,2)StringDecoder 作为解码器 3)StringEncoder 作为编码器 4)我自己的处理程序,它扩展了 SimpleChannelInboundHandler @trustin
    • "close" 回调呢,close 和 channelInactive 的区别是什么
    【解决方案2】:

    channelUnregistered() 在连接尝试不成功的情况下也会被调用。所以channelInactive() 似乎是监听连接关闭事件的更好选择。

    我刚刚在实施重新连接策略时看到了这一点,其中关闭的连接会触发重新连接。 channelUnregistered() 是我的第一选择,显然是错误的,因为它会在每次重新连接后重新触发重新连接,无休止。

    顺便说一句:我还测试了 websocket 连接。

    【讨论】:

      【解决方案3】:

      我使用 netty 4 channelUnregistered

      也许你担心日志上的警告,我解决了它改变日志级别,因为它已经被方法处理但总是出现

      <logger name="io.netty" additivity="false">
          <level value="ERROR" />
          <appender-ref ref="console" />
      </logger>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-14
        • 2017-06-23
        • 2016-12-26
        • 2018-12-15
        • 1970-01-01
        • 2013-12-28
        • 2013-09-02
        • 2015-09-11
        相关资源
        最近更新 更多