Нахождение двух свободных tcp портов

Я понимаю, что следующий код может (возможно, не очень эффективно), узнают свободный порт TCP в Java:

  public static int findFreePort() {
    int port;
    try {
      ServerSocket socket= new ServerSocket(0);
      port = socket.getLocalPort();
      socket.close(); 
    } catch (Exception e) { port = -1; }
    return port;    
  } 

(Существуют некоторые связанные вопросы здесь в ТАК - для пример).

То, что я не понимаю, - то, почему (или ли) два последовательных вызова к этому методу, как гарантируют, возвратят два различных порта. Это принято, например, здесь (ищите вызовы к findFreePort метод).

Это корректно?

6
задан Community 23 May 2017 в 12:09
поделиться

4 ответа

В спецификации Javadoc я не вижу ни одной строки, говорящей о том, что два последовательных вызова гарантированно вернут два разных порта...

Поскольку ServerSocket закрыт, второй вызов может дать тот же самый порт. Статистически это маловероятно, но не невозможно, я думаю.

Если вы откроете два ServerSocket, получите порты, а затем закроете два ServerSocket, вы гарантированно получите два разных порта (поскольку первый не свободен, когда вы создаете второй ServerSocket).

Пример метода для получения n различных свободных портов :

public int[] getFreePorts(int portNumber) throws IOException {
    int[] result = new int[portNumber];
    List<ServerSocket> servers = new ArrayList<ServerSocket>(portNumber);
    ServerSocket tempServer = null;

    for (int i=0; i<portNumber; i++) {
        try {
            tempServer = new ServerSocket(0);
            servers.add(tempServer);
            result[i] = tempServer.getLocalPort();
        } finally {
            for (ServerSocket server : servers) {
                try {
                    server.close();
                } catch (IOException e) {
                    // Continue closing servers.
                }
            }
        }
    }
    return result;
}
5
ответ дан 17 December 2019 в 00:02
поделиться

Один из способов получить два разных номера порта:

  ServerSocket socket1 = new ServerSocket(0);
  port1 = socket1.getLocalPort();
  ServerSocket socket2 = new ServerSocket(0);
  port2 = socket2.getLocalPort();

  socket1.close();
  socket2.close(); 
2
ответ дан 17 December 2019 в 00:02
поделиться

Исходный код для ServerSocket находится здесь: http://kickjava.com/src/java/net/ServerSocket.java.htm

Я не совсем понимаю, как он определяет, свободен порт или нет, но:

@param port the port number, or <code>0</code> to use any
free port.

Итак, как только первый порт выделен, даже для вашего приложения, он больше не свободен. Поэтому последующие вызовы ServerSocket не будут повторно использовать этот порт, что гарантирует два разных порта.

0
ответ дан 17 December 2019 в 00:02
поделиться

Он настолько эффективен, насколько это может сделать операционная система. Однако закрывать ServerSocket сразу после этого бессмысленно, поскольку этот порт больше не зарезервирован и может быть выделен для чего-то другого. Единственная цель этого упражнения - создать ServerSocket, поэтому просто создайте его.

0
ответ дан 17 December 2019 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: