有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么选择。select()总是返回0

我想确定端口是否打开

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) 个答案

  1. # 1 楼答案

    这是因为你选错了项目。你应该已经为OP_CONNECT.注册了频道,然后,当你得到它时,调用finishConnect(),如果它返回真的OP_CONNECT并注册你接下来感兴趣的任何事件,即OP_READOP_WRITE

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

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

    尽管在客户机中使用NIO实际上没有什么意义

    请参阅here了解这个答案的更完整版本