2013-01-02 41 views
6

我正在使用Netty版本2.6.0.Final。Netty - 調用channel.disconnect()實際上關閉了頻道

如果我正確理解Netty文檔,在Channel上調用disconnect()應該允許我調用connect()以後再次連接。但是,當我調用disconnect()時,我的SimpleChannelHandler子類的channelDisconnected()和channelClosed()被調用。

我在調試模式下打開此基本上事件的順序是:

  1. 我對我的頻道
  2. Channels.disconnect()被調用呼叫斷():

    public static ChannelFuture disconnect(Channel channel) { 
        ChannelFuture future = future(channel); 
        channel.getPipeline().sendDownstream(new DownstreamChannelStateEvent(
         channel, future, ChannelState.CONNECTED, null)); 
        return future; 
    } 
    
  3. 最終調用NioSocketPipelineSink.eventSunk(),相關部分爲:

    case CONNECTED: 
         if (value != null) { 
          connect(channel, future, (SocketAddress) value); 
         } else { 
          channel.worker.close(channel, future); 
         } 
         break; 
    

如此以來值爲空,並且狀態被連接時,信道被關閉(根據here具有空CONNECTED儘管應說明斷開,不一定接近的請求。

所以我在這裏錯過了什麼?如果斷開連接()會導致通道關閉,那麼它有什麼意義?

這不是一個大問題,因爲如果我需要我可以爲我的情況創建一個新的通道,但從初始檢查來看,這看起來像是一個Netty錯誤,除非我只是誤解了這應該如何工作或我在做一些愚蠢的事情。

回答

7

Netty的一個目的是提供一個統一的通道抽象,對於面向連接套接字(TCP)或無連接套接字(UDP),或者OIO,NIO或AIO的底層實現,其工作方式都差不多。由於存在不少差異,統一接口對於某些特定實現的某些部分看起來有點奇怪。

斷開TCP套接字的行爲意味着關閉它(至少從Java API的角度來看)。但是,斷開UDP套接字並不意味着關閉它,只是刪除本地IP地址/端口和遠程IP地址/端口之間的關聯。除非你真的需要在一生中將UDP套接字「連接」到不同的遠程目標上,否則,我會建議在OPEN/CLOSE事件上採取行動。

編輯:在前面的段落中錯過了一個重要的「不」。

+0

嗯,我想這是有道理的。我主要只是想找到一種方法,可以在斷開連接後重用Netty TCP通道,而不必完全重新創建整個Channel和管道(並更新引用它的對象),但它可能不夠昂貴而無法成爲問題。 –

+0

TCP連接幾乎總是代表更高層次上的「緊密」連接;對於大多數情況下,嘗試重新使用較低級別資源的工作量會更大,工作量會更大,而當高級連接結束時會丟棄這些資源。 –