简短的回答: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 上的结果是相同的。