Java NIO 是如何构造的 - socketchannel 和 socketserverchannel 内部工作?

How does Java NIO constructs - socketchannel and socketserverchannel work internally?

我有一些关于 socketchannel 和 socketserverchannel 如何工作的具体问题:-

  1. 当 ServerSocketChannel 接受连接时(请参考下面的代码),我的理解是它以某种方式将客户端移动到一个新的随机 selected 端口。这个对吗?有没有办法从一个范围 select 这个端口?我问是因为当我编写这样的服务器并将其部署到 VM 时,我希望能够仅将一组端口列入白名单。如果任何随机端口可以通过 accept() 调用 selected,我该如何实现?我不是必须打开所有端口吗?

    ServerSocketChannel 套接字 = ServerSocketChannel.open();

    socket.bind(new InetSocketAddress("localhost", 1111));

    ... ..

    SocketChannel acceptedSocket= socket.accept();

  2. 客户端代码很简单(请参考下面的代码)

    SocketChannel 客户端= SocketChannel.open(new InetSocketAddress("localhost", 1111)); .....//初始化缓冲区

    client.write(缓冲区);

现在这个客户端正在尝试连接到端口 1111。客户端如何确定它被重定向到哪个端口?它怎么知道写操作必须发生在服务器select编辑的不同端口上?

原来我理解错了。接受连接时,不会创建新端口,而是为同一端口创建新的套接字描述符。在服务器上为每个客户端创建一个不同的套接字描述符,并且与该客户端的所有交互都是通过该描述符进行的。这允许服务器并行处理多个客户端。