1

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

在动态端口上创建连接

在此处输入图像描述

4

2 回答 2

1

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

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

在完成 OP_CONNECT pgphasr 之前,您不应该注册 OP_READ 或 OP_WRITE,此时您还应该取消注册 OP_CONNECT。同时注册这三个人肯定是错误的。

于 2013-07-30T12:14:01.720 回答
1

图像非常小,但经过仔细调查,您有

  • 两个Java进程
  • 第一个过程与自身有联系。每端都有一个连接,端口 52209 和 52210。
  • 它还与端口 1001 上的第二个进程建立了连接。
  • 第二个进程是您正在运行的客户端,其中一个连接到端口 1001
于 2013-07-30T11:54:11.307 回答