我编写了一个简单的java nio程序,如下所示
public static void main(String[] args) throws IOException, InterruptedException {
InetSocketAddress address = new InetSocketAddress("127.0.0.1",1001);
Selector incomingMessageSelector = Selector.open();
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
//到此为止,代码创建了到端口52209和52210的前2个连接
socketChannel.connect(address);
socketChannel.register(incomingMessageSelector, SelectionKey.OP_CONNECT);
socketChannel.register(incomingMessageSelector, SelectionKey.OP_WRITE);
socketChannel.register(incomingMessageSelector, SelectionKey.OP_READ);
//然后它创建2个到端口1001的连接
Thread.sleep(900000L);
}
我想了解为什么它会创建4个连接,使用标准的TCP阻塞库,它往往会创建2个连接。
我使用JDK 1.7和Windows 7。
在图像中,只有4个突出显示的连接是客户创建的。
标有红色的一个连接1条目是服务器端口。
PFA显示这4个连接的图像。!
我真的很困惑为什么
Selector incomingMessageSelector = Selector.open();
在动态端口上创建连接
答案 0 :(得分:1)
图像非常小,但仔细研究后
答案 1 :(得分:1)
1001和52211之间的连接显示两次,每个方向一次,因为两个端口都是本地的。
选择器可以打开另一个侦听套接字,以防它必须处理子选择器,以免超过每个选择器的最大套接字数。
在完成OP_CONNECT pgphasr之后,你应该注销OP_CONNECT,不应该注册OP_READ或OP_WRITE。同时注册所有这三个肯定是错误的。