2014-05-25 68 views
3

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

回答

5

您应该使用channelInactive(),当频道不能再进行通信时触发。 channelUnregistered()有不同的含义,尽管channelUnregistered()总是在channelInactive()之后触发。

+0

我在我的处理程序中覆盖了channelUnregistered和channelInactive。而且他们都不会被触发。可能是什么原因? –

+1

@ismailyavuz可能是因为放置在处理程序之前的一个处理程序没有通过调用'ctx.fireChannelInactive()'或'ctx.fireChannelUnregistered()'来转发该事件? – trustin

+0

我只有这4个在我的initChannel中添加管道。 1)DelimiterBasedFrameDecoder作为成帧器,2)StringDecoder作为解码器3)StringEncoder作为编码器4)我自己的处理程序,它扩展SimpleChannelInboundHandler @trustin –

-1

与网状4我使用channelUnregistered

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

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

channelUnregistered()也被称为在连接尝试失败的情况下。因此channelInactive()似乎是听取连接关闭事件的更好选择。

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

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