为什么selector.select()总是返回0

时间:2014-10-19 11:57:11

标签: java nio socketchannel

我想确定端口是否打开。

InetSocketAddress address = new InetSocketAddress("www.google.com", 80);
Selector selector = Selector.open();
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
socketChannel.connect(address);
socketChannel.register(selector, SelectionKey.OP_WRITE);
int result = selector.select();
System.out.println(result);

如果端口未打开,请认为我看起来一样返回0, 但是当端口打开时,它也返回0,我希望它可以返回1.

1 个答案:

答案 0 :(得分:1)

这是因为你选择了错误的事件。您应该为OP_CONNECT.注册频道然后,当您获得它时,请致电finishConnect(),如果它返回true注销OP_CONNECT并注册您接下来感兴趣的任何事件,即{ {1}}或OP_READ

请注意,如果OP_WRITE返回finishConnect(),您应该继续选择,如果它引发异常,则连接失败,您应该关闭该频道。

如果你想避免所有这些复杂化,通常在阻塞模式下进行连接更简单,然后将通道置于非阻塞模式并选择。

虽然在客户端使用NIO真的很少。

有关此答案的更全面版本,请参阅here