Как найти доступный порт? - PullRequest
174 голосов
/ 20 апреля 2010

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

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

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

Ответы [ 14 ]

4 голосов
/ 30 апреля 2013

Если вы хотите создать собственный сервер, используя ServerSocket, вы можете просто выбрать свободный порт для вас:

  ServerSocket serverSocket = new ServerSocket(0);
  int port = serverSocket.getLocalPort();

Другие реализации сервера обычно имеют аналогичную поддержку. Jetty , например, выбирает свободный порт, если вы не установили явно:

  Server server = new Server();
  ServerConnector connector = new ServerConnector(server);
  // don't call: connector.setPort(port);
  server.addConnector(connector);
  server.start();
  int port = connector.getLocalPort();
3 голосов
/ 20 апреля 2010

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

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

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

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

3 голосов
/ 20 апреля 2010

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

EDIT

Что-то вроде:

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));
}
1 голос
/ 16 ноября 2018

Если вы используете Spring, ответ, предоставленный Михаилом Николаевым , является самым простым и чистым, и IMO следует проголосовать без голосования.Просто для удобства я добавлю встроенный пример, используя Springframwework SocketUtils .findAvailableTcpPort () метод:

int randomAvailablePort = SocketUtils.findAvailableTcpPort();

Этотак просто, всего одна строчка :).Конечно, класс Utils предлагает много других интересных методов, я предлагаю взглянуть на документы.

...