Java nio连接正在创建多个套接字级连接,为什么?

我写了一个简单的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); 

//然后它创建到端口1001的2个连接

  Thread.sleep(900000L); } 

我想了解它为什么创建4个连接,使用标准的TCP阻塞库,它往往会创建2个连接。

我使用JDK 1.7和Windows 7。

在图像中,仅有4个突出显示的连接是由客户端创建的。

标有红色的一个连接1条目是服务器端口。

PFA显示这4个连接的图像。

我真的很困惑为什么

 Selector incomingMessageSelector = Selector.open(); 

在动态端口上创建连接

在此处输入图像描述

图像非常小,但仔细研究就可以了

  • 两个Java进程
  • 第一个进程与自身有联系。 每个端口都有一个连接,端口52209和52210。
  • 它还与端口1001上的第二个进程建立连接。
  • 第二个进程是您运行的客户端,其中一个连接到端口1001

1001和52211之间的连接显示两次,每个方向一次,因为两个端口都是本地的。

选择器可以打开另一个侦听套接字,以防它必须处理子选择器,以便不超过每个选择器的最大套接字数。

在完成OP_CONNECT pgphasr之后,你应该注销OP_CONNECT,你不应该注册OP_READ或OP_WRITE。 同时注册所有这三个是绝对错误的。