我正在编写一个接受连接的NIO服务器
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
接受后,服务器等待Thread.sleep(1000);
,然后注册读取的内容
clientSocketChannel.register(selector, SelectionKey.OP_READ);
同时,由于延迟,一些客户端数据已经通过网络发送并可用。
我正在体验的是,选择器不会为此现有数据触发OP_READ
,因此我必须手动强制读取。然后会为所有后续传入数据正确触发OP_READ
。
这是正常行为吗?为什么尽管有一些数据可供读取,但为什么它不触发?
Selector
(和SelectableChannel
的Javadoc解释说,select()
调用了“自从上一次选择操作以来就可以选择的”通道,对我而言,这意味着如果没有先前的选择操作,它将检查周期)自注册以来,而不是之前。这意味着,是的,您看到的是预期的行为。
这也是合乎逻辑的,没有在读取中注册兴趣的通道没有理由跟踪传入的数据,只有当您注册了这样的兴趣时(也就是说,在为OP_READ
注册选择器之后),它才会开始监视传入数据。
最底线是-您可能想立即注册选择器,而不要等一秒钟才注册。