2017-08-09 247 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,如果你出于某种原因不感兴趣,可能将其设置为零。