2013-11-02 15 views
1

我無法從java文檔中清楚地理解這一點。是否在可選頻道上操作和登記事宜?

考慮我有一個非阻塞模式的可選頻道(SocketChannel)。如果我在調用channel.connect()時返回false,然後我用一個選擇器註冊頻道,如果在select()是第一個之前連接實際完成,select()會用「連接」操作更新創建的鍵被調用,甚至在註冊完成之前?

事件的順序是:

  • connect(返回false
  • 莫名其妙插座成爲在這個時候 「連接」
  • register(返回選擇鍵)
  • select(做了不同的線程,但保證後register

這也適用於其他操作。一般來說,頻道是否按照該頻道上最後一次操作進行註冊,或選擇鍵是否接收自上次頻道操作以來發生的所有未完成事件,都有關係嗎?

回答

0

據的Javadoc SocketChannel

插座通道支持非阻塞連接:一個插座通道可以 被創建並建立鏈接到遠程 插座的過程可以經由連接來發起方法稍後通過 完成finishConnect方法。可以通過調用isConnectionPending方法來確定連接操作是否在 進度中。

此外,對於SocketChannel.connect()狀態的文檔:如果立即建立連接,如可以用 本地連接發生

,則此方法返回true。否則,此方法 返回false,並連接操作以後必須由 調用finishConnect方法時,

完成,因此事件的順序應該是:

  • channel.connect() - 返回false
  • channel.register()
  • selector.select()
  • 當通道被選中時,調用通道。finishConnect()
  • 如果finishConnect()返回true,註銷了OP_CONNECT

通道所以,是的,選擇將確保此套接字通道選擇被放置在其準備一套用於OP_CONNECT

+0

我很抱歉,但在引用的文檔中,如果事件發生在註冊之前,顯然會選擇一個事件? –

+0

@PawelVeselov @PawelVeselov好問題,但你原來的問題的答案是'是':連接完成後,每次你選擇'()'時,'OP_CONNECT'甚至會被激發,直到你註銷'OP_CONNECT.' – EJP

+0

@EJP我認爲這是我原來的問題,或者至少是 - 它在哪裏聲稱,確保選擇鍵將聲明連接操作正在等待,即使在通道註冊之前發生了?你會說,但我不明白爲什麼。 –

相關問題