This ссылка содержит руководство по открытию неблокирующего сокета. Однако предложенный здесь метод не дает возможности выбрать любой случайный порт. Также все конструкторы, показанные на этом java doc page, принимают адрес в качестве аргумента. Любой способ сделать это?Разъемы Java NIO, подключайтесь к любому доступному порту?
ответ
Его немного взломанное решение, но сработало для меня. Вы можете создать обычный Socket, с аргументом порта как 0 (так что вы получите случайный доступный сокет) подключиться к нему, а затем захватить его адрес. Теперь закройте этот сокет и передайте этот адрес в качестве аргумента при создании SocketChannel. Однако будьте осторожны, это может быть проблемой в многопоточной программе, где потоки создают сокет параллельно. Рассмотрим два параллельных потока t1 и t2. Предположим, что t1 создал сокет, захватил его адрес, закрыл его, а затем переключил контекст. Теперь t2 получил один и тот же порт, прежде чем t1 смог подключиться к неблокирующему каналу, используя этот сокет. В таком случае было бы хорошо продолжать цикл до тех пор, пока не будет установлено соединение без блокировки (SocketChannel).
Если посмотреть на конструкторах для InetSocketAddress указывается, что
Допустимое значение порта составляет от 0 до 65535. Номер порта нуля позволит системе подобрать временный порт в безвыходном операция.
По существу, просто перейдите в InetSocketAddress
, используя 0 для аргумента порта, и это приведет к выбору случайного порта.
Я не знаю, работает ли это с NIO, но вы можете попробовать это: https://stackoverflow.com/questions/2231467/dynamically-choosing-port-number. Просто привяжите к порту 0 и выбран произвольный свободный порт – Warrior