Проверка того, что локальный порт TCP не открыт в Java

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

Есть ли простая строка кода Java, которая могла бы проверить, что порт еще не используется другим процессом?


person User1    schedule 19.11.2009    source источник


Ответы (1)


Я вижу два очевидных способа сделать это:

  1. попробуйте подключиться к этому порту на localhost, если вас примут, порт уже используется
  2. попробуйте открыть ServerSocket в режиме прослушивания в этом порту. Если вы получаете исключение "уже привязано", значит, порт уже используется.

Надеюсь, поможет.

person Pablo Santa Cruz    schedule 19.11.2009
comment
Между этими двумя, вероятно, лучше попробовать подключиться - открытие порта с большей вероятностью приведет к появлению брандмауэра пользователя с предупреждением о том, что приложение XYZ пытается прослушивать порт 1234 ... - person Mark Rushakoff; 19.11.2009
comment
Решение ServerSocket было довольно гладким. Всплывающее окно брандмауэра в порядке, поскольку программа в любом случае будет предоставлять услуги на этом порту. Спасибо за вашу помощь. - person User1; 19.11.2009
comment
Просто примечание: если вы попытаетесь подключиться к порту и потерпите неудачу, это может быть связано с тем, что вы заблокированы от брандмауэра для подключения к этому порту. То, что ВЫ не можете подключиться, не означает, что он не используется. - person Mr. Shiny and New 安宇; 19.11.2009
comment
@Мистер. Блестящий и новый: правда. Но он имел в виду локальный, а не удаленный порт. В этом случае шансы на то, что вы не сможете подключиться к этому порту, если он действительно открыт с использованием localhost в качестве имени хоста, минимальны. - person Pablo Santa Cruz; 19.11.2009
comment
@Mark Rushakoff: Не лучше пытаться подключиться, это может привести к непредсказуемым результатам. Фактически, вам никогда не гарантирован ответ при попытке подключения. Так что в лучшем случае у вас есть указание на то, что ничего не работает, но единственный способ убедиться в этом - попытаться выполнить привязку к порту, и либо вы получите исключение, либо преуспеете. - person andy; 23.11.2009