2014-05-25 101 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連接。