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

时间:2013-07-30 11:08:28

标签: java io 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);

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

    Thread.sleep(900000L);
}

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

我使用JDK 1.7和Windows 7。

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

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

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

我真的很困惑为什么

Selector incomingMessageSelector = Selector.open();

在动态端口上创建连接

enter image description here

2 个答案:

答案 0 :(得分:1)

图像非常小,但仔细研究后

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

答案 1 :(得分:1)

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

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

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