我想确定端口是否打开。
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.
答案 0 :(得分:1)
这是因为你选择了错误的事件。您应该为OP_CONNECT.
注册频道然后,当您获得它时,请致电finishConnect()
,如果它返回true注销OP_CONNECT
并注册您接下来感兴趣的任何事件,即{ {1}}或OP_READ
。
请注意,如果OP_WRITE
返回finishConnect()
,您应该继续选择,如果它引发异常,则连接失败,您应该关闭该频道。
如果你想避免所有这些复杂化,通常在阻塞模式下进行连接更简单,然后将通道置于非阻塞模式并选择。
虽然在客户端使用NIO真的很少。
有关此答案的更全面版本,请参阅here。