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