в Java, как мне узнать, открыт ли определенный порт на хосте??(кроме использования сокета, если возможно)

#java #networking

#java #сеть

Вопрос:

новичок, как здесь, так и в Java, я знаю такие коды, как:

 Socket clientSocket=null;

try   
{   
  clientSocket=new Socket(192.168.2.3,1111);
  System.out.println("port open");   
  clientSocket.close();   
}   
catch(Exception   e)   
{   
  System.out.println("port closed");
}
  

может использоваться для проверки того, открыт ли определенный порт (вот порт 1111 на 192.168.2.3), просто блуждающий, есть ли какой-либо другой способ?? возможно, не используя socket ()??

Комментарии:

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

2. tomsalmon.eu/jmap-java-port-scanner

Ответ №1:

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

Сложность всей проблемы проистекает из того факта, что «открытый порт» является подозрительным номером один во всех книгах по безопасности. Системные администраторы используют кучу трюков для борьбы с так называемым «сканированием портов». Это включает в себя сообщение о «ложном срабатывании» (утверждение, что порт открыт, хотя это не так) любому программному обеспечению, которое ведет себя как сканер портов (то есть: устанавливает соединение и отключается без отправки каких-либо данных).

Итак, на самом деле лучший способ — установить соединение, отправить запрос и обработать ответ. Любой другой подход может дать сбой при определенных конфигурациях сети / хоста / безопасности, оставляя вашего пользователя озадаченным относительно того, почему его приложение не работает, когда оно утверждает, что проблем с подключением нет.