2016-05-27 1 views
2

This ссылка содержит руководство по открытию неблокирующего сокета. Однако предложенный здесь метод не дает возможности выбрать любой случайный порт. Также все конструкторы, показанные на этом java doc page, принимают адрес в качестве аргумента. Любой способ сделать это?Разъемы Java NIO, подключайтесь к любому доступному порту?

+0

Я не знаю, работает ли это с NIO, но вы можете попробовать это: https://stackoverflow.com/questions/2231467/dynamically-choosing-port-number. Просто привяжите к порту 0 и выбран произвольный свободный порт – Warrior

ответ

3

Его немного взломанное решение, но сработало для меня. Вы можете создать обычный Socket, с аргументом порта как 0 (так что вы получите случайный доступный сокет) подключиться к нему, а затем захватить его адрес. Теперь закройте этот сокет и передайте этот адрес в качестве аргумента при создании SocketChannel. Однако будьте осторожны, это может быть проблемой в многопоточной программе, где потоки создают сокет параллельно. Рассмотрим два параллельных потока t1 и t2. Предположим, что t1 создал сокет, захватил его адрес, закрыл его, а затем переключил контекст. Теперь t2 получил один и тот же порт, прежде чем t1 смог подключиться к неблокирующему каналу, используя этот сокет. В таком случае было бы хорошо продолжать цикл до тех пор, пока не будет установлено соединение без блокировки (SocketChannel).

5

Если посмотреть на конструкторах для InetSocketAddress указывается, что

Допустимое значение порта составляет от 0 до 65535. Номер порта нуля позволит системе подобрать временный порт в безвыходном операция.

По существу, просто перейдите в InetSocketAddress, используя 0 для аргумента порта, и это приведет к выбору случайного порта.

Смежные вопросы