我正在尝试使用 Java NIO。一切都很好,直到我尝试在模拟器无法访问互联网时测试连接。接下来的结果是:
在 2.2 select() 选择 1 个键,然后 finishConnect() 调用抛出异常。正如预期的那样。但它仅在第一行未注释时才有效(preferIPv6 = false)。
但是在 4.1.2 select() 总是返回零。并且选定的键集为空。检查值表示,选择键始终未准备好进行任何操作,interestOps 为 8 (OP_CONNECT)。
在 java connect() 调用中抛出 IOException: Network is unreachable。正如预期的那样。
我做错了什么以及如何导致 select() 阻塞?
//System.setProperty("java.net.preferIPv6Addresses", "false");
try {
Selector selector = Selector.open();
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
boolean connected = socketChannel.connect(new InetSocketAddress("173.194.44.3", 80));
SelectionKey selectionKey;
if (connected) {
selectionKey = socketChannel.register(selector, SelectionKey.OP_READ);
} else {
selectionKey = socketChannel.register(selector, SelectionKey.OP_CONNECT);
}
while (true) {
int selected = selector.select();
if (selected == 0) continue;
for (SelectionKey key : selector.selectedKeys()) {
if (socketChannel.finishConnect()) {
key.interestOps(SelectionKey.OP_READ);
}
}
selector.selectedKeys().clear();
}
} catch (IOException e) {
throw new RuntimeException("IOException", e);
}
谢谢。