Netty SimpleChannelInboundHandler关闭通道

6

我有一个扩展了SimpleChannelInboundHandler的处理程序,用于处理websocket帧。从客户端关闭连接的角度来看 (无论是浏览器关闭还是网络连接崩溃),检测连接关闭的最佳方法是什么?我发现在ChannelInboundHandlerAdapter中有两个方法:channelUnregistered和channelInactive。我能否使用它们来检测通道关闭?

3个回答

5

当一个通道无法再进行通信时,您应该使用 channelInactive(),它会触发。虽然channelUnregistered()总是在channelInactive()之后被触发,但其含义不同。


我在我的处理程序中覆盖了channelUnregistered和channelInactive两个方法。但是它们都从未被触发过。可能的原因是什么? - Ismail Yavuz
1
@ismailyavuz 可能是因为在您的处理程序之前放置的某个处理程序没有通过调用ctx.fireChannelInactive()ctx.fireChannelUnregistered()来转发事件。 - trustin
我在我的initChannel中只有这4个来添加pipeline。1)作为framer的DelimiterBasedFrameDecoder,2)作为decoder的StringDecoder,3)作为encoder的StringEncoder,4)扩展SimpleChannelInboundHandler<String>的我的自定义处理程序@trustin。 - Ismail Yavuz
1
“close”回调怎么样?close和channelInactive有什么区别? - JaskeyLam

0

channelUnregistered() 在连接尝试失败的情况下也会被调用。因此,channelInactive() 似乎是更好的选择来监听连接关闭事件。

我在实现重新连接策略时看到了这个问题,其中关闭的连接会触发重新连接。channelUnregistered() 是我的第一选择,但显然是错误的,因为它会在每次重新连接后不断地重新触发重新连接。

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


-1

使用Netty 4时,我使用channelUnregistered

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接