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

标签 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。

最佳答案

这是因为您选择了错误的 Activity 。您应该已经注册了 OP_CONNECT 的 channel 。 然后,当您获取它时,调用 finishConnect(),如果它返回 true,则取消注册 OP_CONNECT 并注册您接下来感兴趣的任何事件,即 OP_READOP_WRITE

请注意,如果finishConnect()返回false,您应该继续选择,如果它抛出异常,则连接失败,您应该关闭 channel 。

如果您想避免所有这些复杂情况,通常更简单的方法是在仍处于阻塞模式时进行连接,然后将 channel 置于非阻塞模式并选择。

尽管在客户端中使用 NIO 确实没有什么意义。

参见here获取此答案的完整版本。

关于java - 为什么selector.select()总是返回0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26450235/

相关文章:

java - 将 int 数组传递给方法

Java ByteBuffer 性能问题

java - 找不到包 java.nio.file

java nio socketChannel 读取总是返回相同的数据

java - Ascii 表空间

java - Spring-WS、REST、SOAP、HTTP、JMS

JAVA NIO ByteBuffer 分配以适应最大的数据集?

Android:在 Wifi 网络上查找同行

Java NIO SocketChannel 读取预定义字节数

java - 返回日期或日历字段