1

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

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

    ServerSocketChannel 套接字 = ServerSocketChannel.open();

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

    ... ..

    SocketChannel 接受Socket= socket.accept();

  2. 客户端代码非常简单(请参阅下面的代码)。

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

    客户端.write(缓冲区);

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

4

1 回答 1

0

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

在此处输入图像描述

于 2021-03-03T13:48:00.213 回答