Динамический выбор номера порта?

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

вот одна идея, которая у меня была, которая работает так:

  • есть фиксированный начальный номер порта А.
  • программа "MyApp" запускается, пытается хватай порт А.
  • если это удастся, то это первый экземпляр "MyApp". Сделанный.
  • если это не удается, он спрашивает через порт A, является ли программа на A экземпляром "MyApp". Если да, свяжитесь с этим экземпляром. Сделанный. Если нет, попробуйте захватить порт a+1. И если есть другая программа, использующая этот порт (не экземпляр "MyApp"), то возьмите a+2, затем a+3 и так далее.

имеет ли эта стратегия смысл? Или есть лучший способ динамически выбрать номер порта?

3 ответов


Если вы привязываетесь к Порту 0, Java будет использовать системный порт. :- ) Итак, это, вероятно, самый простой способ отступить, если ваш желаемый порт уже используется.

ServerSocket s = new ServerSocket(0);
int port = s.getLocalPort();    // returns the port the system selected

Я бы взял обратный и выбрал фиксированный высокий порт для вашего приложения. Сделайте его значением конфигурации, чтобы при необходимости его можно было изменить. Это упростит настройку, так как часто пользователям приложений необходимо запрашивать сетевые операции для открытия портов. Работа вокруг назначенных значений IANA:

http://www.iana.org/assignments/port-numbers

сканирование портов может превратить ваше приложение в плохого гражданина для многих систем обнаружения вторжений.


вы можете использовать Bonjour/ZeroConf для объявления служб каждого экземпляра и включения экземпляра для поиска других. Думайте об этом как служба каталогов что может помочь управлять пространством имен портов.

в этом случае каждый экземпляр может просто захватить динамически назначенный порт. Запрос на привязку к Порту " 0 " обычно указывает системе назначить динамический порт.