我想确定端口是否打开。
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。
最佳答案
这是因为您选择了错误的 Activity 。您应该已经注册了 OP_CONNECT 的 channel 。
然后,当您获取它时,调用 finishConnect()
,如果它返回 true,则取消注册 OP_CONNECT
并注册您接下来感兴趣的任何事件,即 OP_READ
或 OP_WRITE
。
请注意,如果finishConnect()
返回false
,您应该继续选择,如果它抛出异常,则连接失败,您应该关闭 channel 。
如果您想避免所有这些复杂情况,通常更简单的方法是在仍处于阻塞模式时进行连接,然后将 channel 置于非阻塞模式并选择。
尽管在客户端中使用 NIO 确实没有什么意义。
参见here获取此答案的完整版本。
关于java - 为什么selector.select()总是返回0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26450235/