如果数据已经可用,则不会触发Java Selector OP_READ

问题描述 投票:0回答:1

我正在编写一个接受连接的NIO服务器

serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

接受后,服务器等待Thread.sleep(1000);,然后注册读取的内容

clientSocketChannel.register(selector, SelectionKey.OP_READ);

同时,由于延迟,一些客户端数据已经通过网络发送并可用。

我正在体验的是,选择器不会为此现有数据触发OP_READ,因此我必须手动强制读取。然后会为所有后续传入数据正确触发OP_READ

这是正常行为吗?为什么尽管有一些数据可供读取,但为什么它不触发?

java nio
1个回答
0
投票

Selector(和SelectableChannel的Javadoc解释说,select()调用了“自从上一次选择操作以来就可以选择的”通道,对我而言,这意味着如果没有先前的选择操作,它将检查周期)自注册以来,而不是之前。这意味着,是的,您看到的是预期的行为。

这也是合乎逻辑的,没有在读取中注册兴趣的通道没有理由跟踪传入的数据,只有当您注册了这样的兴趣时(也就是说,在为OP_READ注册选择器之后),它才会开始监视传入数据。

最底线是-您可能想立即注册选择器,而不要等一秒钟才注册。

© www.soinside.com 2019 - 2024. All rights reserved.