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 楼答案
这是因为你选错了项目。你应该已经为
OP_CONNECT.
注册了频道,然后,当你得到它时,调用finishConnect()
,如果它返回真的OP_CONNECT
并注册你接下来感兴趣的任何事件,即OP_READ
或OP_WRITE
请注意,如果
finishConnect()
返回false
,您应该继续选择,如果它引发异常,则连接失败,您应该关闭通道如果您想避免所有这些复杂情况,通常更简单的方法是在仍处于阻塞模式时进行连接,然后将通道置于非阻塞模式并选择
尽管在客户机中使用NIO实际上没有什么意义
请参阅here了解这个答案的更完整版本