Найти свободный порт в 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

видно, что