-1

我试图找出为什么选择器不起作用。这是代码:

//SocketChannel ch
//java.nio.channels.Selector impl
//Object session
SelectionKey sk = ch.register(impl, 0x01, session);
int i = impl.select();
System.out.println(i);

打印的值为零。这是程序中 SocketChannel.register 的唯一调用,因此,据我了解:
a)应在注册期间创建一个新的 SelectionKey;
b)因此,一个键的“准备操作集”应该在选择期间更新,即这个方法应该返回1。

为什么它不能像我预期的那样工作?究竟是什么意思“谁的就绪操作集被更新”?

4

1 回答 1

1

您似乎不理解所使用术语的含义。“就绪”表示“准备好执行 I/O 操作而不会阻塞”。例如, OP_READ 准备好意味着 read() 将返回一个正整数,指示已读取的字节数,或 -1 指示流结束。具体来说,它不会返回零,表示没有数据可供读取。

您的代码中没有任何内容可以证明 select() 应该返回任何选定的键。只有来自对等方的一些外部事件会导致这种情况,而您对此只字未提。

注意不要使用幻数 0x01。选择事件有清单常量:SelectionKey.OP_READ 和朋友。使用它们。

于 2013-05-12T02:18:46.377 回答