2012-10-04 2 views
0

Я хотел бы сканировать диапазон IP-адресов из моей подсети. Я хотел бы сохранить IP-адреса, которые будут слышны на определенном порту. Я использую этот код:Как найти адреса Ip, где прослушивание порта x

 for (int host = 1; host < 255; host++) { 
      String ip = networkAddress + host; 

      Socket socket; 
      try { 
       socket = new Socket(ip, port); 
       System.out.println(ip + " +"); 
       serverList.add(ip); 
       socket.close(); 
      } 
      catch (Exception e) { 
       System.out.println(ip + " -"); 
      } 
     } 

Но моя проблема в том, что она занимает слишком много времени ... Есть ли более быстрый способ?

ответ

1

Использование многоуровневых. Поскольку большая часть времени фактически потрачена на ожидание ответа, вы можете безопасно создать 100 (или даже 200) потоков, сократив общее время на два порядка. Используйте класс Executors, чтобы создать пул потоков и отправить одну задачу на каждый хост.

Помните, что коллекция serverList должна быть потокобезопасной. Используйте shutdown() и awaitTermination() пару ждет результатов. В качестве альтернативы используйте CompletionService для сбора результатов по мере их поступления.

0

Используйте new Socket() (без аргументов), а затем позвоните Socket.connect() с коротким таймаутом, скажем несколько секунд.

Смежные вопросы