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);
}
ありがとう。