簡単な回答:OP_CONNECT
受け入れられた接続に関心のある操作のリストから削除します。受け入れられた接続は既に接続されています。
私は問題を再現することができました。これはまさにあなたに起こっていることかもしれません:
import java.net.*;
import java.nio.channels.*;
public class MyNioServer {
public static void main(String[] params) throws Exception {
final ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(true);
serverChannel.socket().bind(new InetSocketAddress("localhost", 12345));
System.out.println("Listening for incoming connections");
final SocketChannel clientChannel = serverChannel.accept();
System.out.println("Accepted connection: " + clientChannel);
final Selector selector = Selector.open();
clientChannel.configureBlocking(false);
final SelectionKey clientKey = clientChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_CONNECT);
System.out.println("Selecting...");
System.out.println(selector.select());
System.out.println(selector.selectedKeys().size());
System.out.println(clientKey.readyOps());
}
}
上記のサーバーが接続を受信した後、接続の最初のサーバーはselect()
ブロックせずに終了し、操作の準備が整ったキーはありません。なぜ Java がこのように動作するのかはわかりませんが、多くの人がこの動作に悩まされているようです。
結果は、Windows XP 上の Sun の JVM 1.5.0_06 と、Linux 2.6 上の Sun の JVM 1.5.0_05 および 1.4.2_04 で同じです。