Найти свободный порт на Java



Мне нужно найти свободный порт в приложении Java. Почему приведенный ниже код не работает? Он всегда возвращает 0.



public int findFreePort() {
int portNumber = new InetSocketAddress(0).getPort();
return portNumber;
}


Java doc of new InetSocketAddress() говорит:



Создает адрес сокета, где IP-адрес является подстановочным адресом, а номер порта-заданным значением.



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

638   1  

1 ответ:

Фактически выводится элемент порта, указанный в конструкторе. Так что 0 ожидается.
Javadoc утверждает, что порт позволит системе подобрать эфемерный порт для операции привязки. Это не говорит о том, что номер порта будет оцениваться с помощью эфемерного порта непосредственно в экземпляре InetSocketAddress. На самом деле вы не выполняете операцию привязки с этим экземпляром InetSocketAddress.
В clear вы не открывали/не создавали сокет-канал для связи с этим экземпляром. Так вы не могу заметить результат работы порта.

Например, это связывает a ServerSocket С A InetSocketAddress:

ServerSocket ss = new ServerSocket(..);
ss.bind(new InetSocketAddress(0));
Вот более полный пример, иллюстрирующий, как все работает:
public class InetSockerAddressWithEphemeralPortMain {

    public static void main(String[] args) throws InterruptedException, IOException {
        InetSocketAddress randomSocketAddressFirst = new InetSocketAddress(0);

        try (ServerSocket ssOne = new ServerSocket()) {
            System.out.println("randomSocketAddress port before any binding : " + randomSocketAddressFirst.getPort());
            ssOne.bind(randomSocketAddressFirst);
            System.out.println("local port after first binding :" + ssOne.getLocalPort());
        }

        try (ServerSocket ssTwo = new ServerSocket()) {
            ssTwo.bind(randomSocketAddressFirst);
            System.out.println("local port after second binding :" + ssTwo.getLocalPort());
            System.out.println("randomSocketAddress port after all bindings : " + randomSocketAddressFirst.getPort());
        }

    }
}

Вывод:

Порт Randomsocket address перед любой привязкой: 0

Локальный порт после первой привязки: 65110

Локальный порт после Второй привязки: 65111

Порт Randomsocket address после всех привязок: 0

Вы можете видеть что объект InetSocketAddress всегда сохраняет 0 в качестве значения порта, в то время как объекты ServerSocket извлекают выгоду из подобранного эфемерного порта.

Comments

    Ничего не найдено.