Как найти доступный порт?

Я хочу запустить сервер, которые слушают порт. Я могу указать порт явно, и он работает. Но я хотел бы найти порт автоматическим способом. В этом отношении у меня есть два вопроса.

  1. В котором диапазоне номеров портов я должен искать? (Я использовал порты 12345, 12346, и 12347, и это было прекрасно).

  2. Как я могу узнать, не занят ли данный порт другим программным обеспечением?

187
задан Roman 20 April 2010 в 02:16
поделиться

8 ответов

Если вы не возражаете против используемого порта, укажите порт 0 в конструкторе ServerSocket , и он будет прослушивать любой свободный порт.

ServerSocket s = new ServerSocket(0);
System.out.println("listening on port: " + s.getLocalPort());

Если вы хотите использовать определенный набор портов, то, вероятно, проще всего перебрать их, пока один из них не сработает. Примерно так:

public ServerSocket create(int[] ports) throws IOException {
    for (int port : ports) {
        try {
            return new ServerSocket(port);
        } catch (IOException ex) {
            continue; // try next port
        }
    }

    // if the program gets here, no port in the range was found
    throw new IOException("no free port found");
}

Можно использовать так:

try {
    ServerSocket s = create(new int[] { 3843, 4584, 4843 });
    System.out.println("listening on port: " + s.getLocalPort());
} catch (IOException ex) {
    System.err.println("no available ports");
}
263
ответ дан 23 November 2019 в 05:46
поделиться

Если ваш сервер запускается, значит, этот сокет не использовался.

РЕДАКТИРОВАТЬ

Примерно так:

ServerSocket s = null ;

try { 
    s = new ServerSocket( 0 ); 
} catch( IOException ioe ){
   for( int i = START; i < END ; i++ ) try {
        s = new ServerSocket( i );
    } catch( IOException ioe ){}
}
// At this point if s is null we are helpless
if( s == null ) {
    throw new IOException(
       Strings.format("Unable to open server in port range(%d-%d)",START,END));
}
3
ответ дан 23 November 2019 в 05:46
поделиться

Это может вам не сильно помочь, но на моей машине (Ubuntu) у меня есть файл / etc / services, в котором указаны хотя бы порты, используемые / зарезервированные некоторыми приложениями. Это стандартные порты для этих приложений.

Нет гарантий, что они работают, только порты по умолчанию, которые используются этими приложениями (поэтому вам не следует их использовать, если это возможно).

Определено чуть больше 500 портов, примерно половина UDP и половина TCP.

Файлы созданы с использованием информации IANA, см. Назначенные номера портов IANA .

3
ответ дан 23 November 2019 в 05:46
поделиться

Согласно Википедии , вы должны использовать порты с 49152 на 65535 , если вам не нужен «хорошо известный» порт.

Насколько мне известно, единственный способ определить, используется ли порт, - это попытаться его открыть.

25
ответ дан 23 November 2019 в 05:46
поделиться

Если вы передадите 0 в качестве номера порта конструктору ServerSocket, он выделит вам порт.

53
ответ дан 23 November 2019 в 05:46
поделиться

Eclipse SDK содержит класс SocketUtil , который делает то, что вы хотите. Вы можете ознакомиться с исходным кодом git .

11
ответ дан 23 November 2019 в 05:46
поделиться

См. http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html# ServerSocket% 28int% 29

Создает серверный сокет, привязанный к указанному порту. Порт 0 создает сокет на любом свободном порте.

6
ответ дан 23 November 2019 в 05:46
поделиться

Это работает у меня на Java 6

    ServerSocket serverSocket = new ServerSocket(0);
    System.out.println("listening on port " + serverSocket.getLocalPort());
6
ответ дан 23 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

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