Найти свободный порт на Java
Мне нужно найти свободный порт в приложении Java. Почему приведенный ниже код не работает? Он всегда возвращает 0.
public int findFreePort() {
int portNumber = new InetSocketAddress(0).getPort();
return portNumber;
}
Java doc of new InetSocketAddress() говорит:
Создает адрес сокета, где IP-адрес является подстановочным адресом, а номер порта-заданным значением.
Допустимое значение порта находится в диапазоне от 0 до 65535. Нулевой номер порта позволит системе выбрать эфемерный порт в операции привязки.
1 ответ:
Фактически выводится элемент порта, указанный в конструкторе. Так что
0ожидается.
Javadoc утверждает, что порт позволит системе подобрать эфемерный порт для операции привязки. Это не говорит о том, что номер порта будет оцениваться с помощью эфемерного порта непосредственно в экземпляреInetSocketAddress. На самом деле вы не выполняете операцию привязки с этим экземпляромInetSocketAddress.
В clear вы не открывали/не создавали сокет-канал для связи с этим экземпляром. Так вы не могу заметить результат работы порта.Например, это связывает a
ServerSocketС AInetSocketAddress:Вот более полный пример, иллюстрирующий, как все работает: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