Netty SimpleChannelInboundHandler关闭通道
问题描述:
我有扩展SimpleChannelInboundHandler的处理程序。我用它来处理websocket框架。 什么是最好的方式来检测从客户端关闭连接(浏览器关闭或网络连接崩溃)? 我看到ChannelInboundHandlerAdapter中有两个方法:channelUnregistered和channelInactive。我可以将其用于检测通道关闭吗?Netty SimpleChannelInboundHandler关闭通道
答
您应该使用channelInactive()
,当频道不能再进行通信时触发。 channelUnregistered()
有不同的含义,尽管channelUnregistered()
总是在channelInactive()
之后触发。
答
与网状4我使用channelUnregistered
也许你担心在日志中的警告,我解决它改变日志级别,因为它已经通过该方法处理,但总是出现
<logger name="io.netty" additivity="false">
<level value="ERROR" />
<appender-ref ref="console" />
</logger>
答
channelUnregistered()
也被称为在连接尝试失败的情况下。因此channelInactive()
似乎是听取连接关闭事件的更好选择。
我刚刚在实现重新连接策略时看到了这一点,关闭连接会触发重新连接。 channelUnregistered()
是我的第一选择,显然是错误的,因为它会在每次重新连接后重新触发重新连接,无休止地。
顺便说一句:我还测试了websocket连接。
我在我的处理程序中覆盖了channelUnregistered和channelInactive。而且他们都不会被触发。可能是什么原因? –
@ismailyavuz可能是因为放置在处理程序之前的一个处理程序没有通过调用'ctx.fireChannelInactive()'或'ctx.fireChannelUnregistered()'来转发该事件? – trustin
我只有这4个在我的initChannel中添加管道。 1)DelimiterBasedFrameDecoder作为成帧器,2)StringDecoder作为解码器3)StringEncoder作为编码器4)我自己的处理程序,它扩展SimpleChannelInboundHandler @trustin –