2017-08-09 194 views
0

我正試圖實施NIO服務器並且有一個關於SelectionKey的問題。假設我們提取了一些準備好讀取的密鑰。就像這樣:從選擇器中刪除密鑰

SelectionKey key; 
//... 
SocketChannel c = (SocketChannel) key.channel; 
//read from c 

但是我們從通道讀取的是不足以使一個完整的Packet。所以我附加了一些對象到key

問:什麼時候應該從Selector中刪除key?當我讀完整Packet?或者每當我重新註冊頻道時,請刪除Selector中的密鑰,並將接收到的數據重新附加到新註冊的SelectionKey

回答

1

什麼時候應該從選擇器中刪除密鑰?

當您不再對其Channel中的事件感興趣時。這很少見。大多數情況下,您只需關閉Channel即可自動取消SelectionKey

當我閱讀完整的數據包?

不,爲什麼?

或者每次我要重新註冊通道時,刪除選擇

沒有鑰匙,爲什麼呢?如果您有興趣閱讀該頻道的活動,爲什麼您的興趣會停止,直到您關閉Channel?除了您正在對該頻道寫短文的情況之外,在這種情況下,您應該停止有興趣閱讀該文件:但您可以通過如下操作interestOps來完成此操作。

並重新附加接收到新註冊的SelectionKey的數據?

我不知道這是什麼意思。真的沒有理由爲現有頻道註冊新的SelectionKey。只是玩弄其interestOps,如果你出於某種原因不感興趣,可能將其設置爲零。