Как внутри работают конструкции Java NIO — socketchannel и socketserverchannel?

У меня есть несколько конкретных вопросов, связанных с тем, как работают socketchannel и socketserverchannel:

  1. Когда ServerSocketChannel принимает соединение (см. код ниже), насколько я понимаю, он каким-то образом перемещает клиента на новый случайно выбранный порт. Это правильно? Есть ли способ выбрать этот порт из диапазона? Я спрашиваю, потому что, когда я пишу и развертываю такой сервер на виртуальной машине, я хочу иметь возможность внести в белый список только набор портов. Если любой случайный порт может быть выбран вызовом accept(), как я могу этого добиться? Разве я не должен открывать все порты?

    Сокет ServerSocketChannel = ServerSocketChannel.open();

    socket.bind(новый InetSocketAddress(localhost, 1111));

    ... ..

    SocketChannel acceptSocket= socket.accept();

  2. Код клиента довольно прост (см. код ниже).

    Клиент SocketChannel = SocketChannel.open (новый InetSocketAddress (localhost, 1111)); .....//инициализировать буфер

    клиент.запись(буфер);

Теперь этот клиент пытается подключиться к порту 1111. Как клиент определяет, на какой порт он был перенаправлен? Как он узнает, что операция записи должна выполняться на другом порту, выбранном сервером?


person user3740951    schedule 06.01.2021    source источник


Ответы (1)


Оказывается, я неправильно понял. Когда соединение принято, новый порт не создается, вместо этого создается новый дескриптор сокета для того же порта. Для каждого клиента на сервере создается отдельный дескриптор сокета, и все взаимодействие с этим клиентом осуществляется через этот дескриптор. Это позволяет серверу обрабатывать несколько клиентов параллельно.

введите здесь описание изображения

person user3740951    schedule 03.03.2021