【发布时间】:2013-07-31 11:23:07
【问题描述】:
我写了一个简单的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();
在动态端口上创建连接
【问题讨论】:
-
这听起来很奇怪。恕我直言,我发现阻塞 NIO 更容易使用,如果您的连接数较少,则速度更快。
-
是的,它可能从 API 更简单,但我更关注为什么在 TCP 级别创建 4 个连接,而仅从代码创建 1 个连接。
-
您能否将“端口 50512 和 50513”的条目包括在您的图像中。
-
我已经更新了图像,因此在新图像中有不同的端口,忘记相应地更新问题文本,我现在也更新了问题