从选择器中删除键

时间:2017-08-09 11:03:46

标签: java nio

我正在尝试实施NIO服务器并对SelectionKey提出疑问。假设我们提取了一些准备好读取的密钥。像这样:

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

但我们从频道中读到的内容不足以制作完整的Packet。所以我将一些对象附加到key

问题:我应该何时从key删除Selector?当我阅读完整的Packet时?或者每次我应该重新注册频道时,从Selector删除密钥并重新附加收到的数据到新注册的SelectionKey

1 个答案:

答案 0 :(得分:1)

  

我应该何时从选择器中删除密钥?

当您不再对其Channel的活动感兴趣时。这很少见。大多数情况下,您只需关闭Channel即可自动取消SelectionKey

  

当我阅读完整的数据包?

不,为什么?

  

或者每次重新注册频道时,请从选择器中删除密钥

不,为什么?如果您对通道中的阅读事件感兴趣,为什么在关闭Channel之前,这种兴趣会不会停止?除了你对该频道进行简短写入的情况之外,在这种情况下你肯定不再有兴趣阅读它了:但你可以通过操纵如下interestOps来做到这一点。

  

并重新附加收到新注册的SelectionKey的数据?

我不知道这意味着什么。没有理由为现有频道注册新的SelectionKey。只需使用interestOps进行游戏,如果你出于某种原因对所有人都不感兴趣,可以将它们设置为零。