Проверьте открытые порты с Java - PullRequest
1 голос
/ 03 февраля 2011

Используя Java, как я могу проверить, открыт ли определенный порт TCP / IP и не заблокирован ли он брандмауэром?

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011

Проверить, открыт ли порт для входящих соединений? Вы должны спросить брандмауэр. Предположим, вы слушаете порт, но этот порт заблокирован брандмауэром, и вы будете ждать «вечно».

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

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

2 голосов
/ 03 февраля 2011

Сокет позволяет соединить 2 машины в сети. На этом пути может быть несколько filrewalls:

  1. персональный межсетевой экран с обеих сторон
  2. межсетевые экраны компаний с обеих сторон.
  3. межсетевые экраны интернет-провайдеров с обеих сторон.

Межсетевые экраны могут быть настроены на блокировку

  1. определенные IP-адреса
  2. определенные порты
  3. определенные протоколы
  4. направление движения (вход / выход ограничено)

Более того, две разные ситуации выглядят одинаково с точки зрения TCP:

  1. сервер не слушает порт
  2. межсетевой экран блокирует соединение (см. Выше)

Вскоре сначала вы должны решить, что вы хотите проверить. Если, например, вы просто хотите знать, что вы можете подключиться к определенному порту на определенной машине, позвоните new Socket(host, port) и поймайте исключение. Если вы хотите различить ситуацию, когда брандмауэр беспокоит вас, или пульт не отвечает, этого недостаточно.

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

2 голосов
/ 03 февраля 2011

Если под «порт открыт» вы подразумеваете, что этот порт может использоваться вашим серверным приложением, то вы можете просто сделать:

try {
    serverSocket = new ServerSocket(port);
} catch (IOException e) {
    System.out.println("Could not listen on port: " + port);
    // ...
}

IOException будет выброшено, если вы не можете открыть сокет сервера на этом порту.

Если под «не заблокирован брандмауэром» вы имеете в виду, что к этому порту можно получить доступ с хостов вне вашей сети, то нет прямого способа проверить это, не пытаясь открыть соединение с вашим хостом: порт из внешней сети. Между хостом, на котором запущена ваша служба, и хостом могут быть другие брандмауэры / NAT, которые могут попытаться подключиться к вашей службе.

Существует несколько распространенных методов, позволяющих проверить доступность службы из внешней сети, см., Например, Обход NAT .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...