我正在尝试实施NIO服务器并对SelectionKey
提出疑问。假设我们提取了一些准备好读取的密钥。像这样:
SelectionKey key;
//...
SocketChannel c = (SocketChannel) key.channel;
//read from c
但我们从频道中读到的内容不足以制作完整的Packet
。所以我将一些对象附加到key
。
问题:我应该何时从key
删除Selector
?当我阅读完整的Packet
时?或者每次我应该重新注册频道时,从Selector
删除密钥并重新附加收到的数据到新注册的SelectionKey
?
答案 0 :(得分:1)
我应该何时从选择器中删除密钥?
当您不再对其Channel
的活动感兴趣时。这很少见。大多数情况下,您只需关闭Channel
即可自动取消SelectionKey
。
当我阅读完整的数据包?
不,为什么?
或者每次重新注册频道时,请从选择器中删除密钥
不,为什么?如果您对通道中的阅读事件感兴趣,为什么在关闭Channel
之前,这种兴趣会不会停止?除了你对该频道进行简短写入的情况之外,在这种情况下你肯定不再有兴趣阅读它了:但你可以通过操纵如下interestOps
来做到这一点。
并重新附加收到新注册的SelectionKey的数据?
我不知道这意味着什么。没有理由为现有频道注册新的SelectionKey
。只需使用interestOps
进行游戏,如果你出于某种原因对所有人都不感兴趣,可以将它们设置为零。