我试图找出,为什么选择器不起作用。 这是代码:
//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
为什么它不像我期望的那样工作?究竟什么意思是“其现成的操作集更新了”?
答案 0 :(得分:1)
您似乎不理解您正在使用的术语的含义。 “就绪”意味着“准备执行I / O操作而不会阻塞”。例如,OP_READ就绪意味着read()将返回一个正整数,表示已读取的字节数,或-1表示流的结束。具体来说,它不会返回零,表示没有可供读取的数据。
您的代码中没有任何内容证明select()应该返回任何选定的键。只有来自同行的一些外部事件才能引起这种情况,而且你对此没有任何说明。
注意不要使用幻数0x01。选择事件有清单常量:SelectionKey.OP_READ和朋友。使用它们。