2011-02-10 2 views
1

Я пытаюсь написать класс, который сканирует локальную сеть для службы, которая будет запущена.Java Network Service Scanner

Проблема в том, что если адрес не активен (нет ответа), он вешает трубку на 5+ секунд, что не очень хорошо.

Я хочу, чтобы это сканирование было выполнено за несколько секунд. Может ли кто-нибудь предложить какой-нибудь совет?

Мой часть кода ниже

 int port = 1338; 
    PrintWriter out = null; 
    BufferedReader in = null; 

    for (int i = 1; i < 254; i++){ 

     try { 
      System.out.println(iIPv4+i); 
      Socket kkSocket = null; 

      kkSocket = new Socket(iIPv4+i, port); 

      kkSocket.setKeepAlive(false); 
      kkSocket.setSoTimeout(5); 
      kkSocket.setTcpNoDelay(false); 

      out = new PrintWriter(kkSocket.getOutputStream(), true); 
      in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream())); 
      out.println("Scanning!"); 
      String fromServer; 
      while ((fromServer = in.readLine()) != null) { 
       System.out.println("Server: " + fromServer); 
       if (fromServer.equals("Server here!")) 
        break; 
      } 

     } catch (UnknownHostException e) { 

     } catch (IOException e) { 

     } 
    } 

Спасибо за ответы! Вот мой код для всех, кто ищет это!

 for (int i = 1; i < 254; i++){ 

     try { 
      System.out.println(iIPv4+i); 
      Socket mySocket = new Socket(); 
      SocketAddress address = new InetSocketAddress(iIPv4+i, port); 

      mySocket.connect(address, 5); 

      out = new PrintWriter(mySocket.getOutputStream(), true); 
      in = new BufferedReader(new InputStreamReader(mySocket.getInputStream())); 
      out.println("Scanning!"); 
      String fromServer; 
      while ((fromServer = in.readLine()) != null) { 
       System.out.println("Server: " + fromServer); 
       if (fromServer.equals("Server here!")) 
        break; 
      } 

     } catch (UnknownHostException e) { 

     } catch (IOException e) { 

     } 
    } 

ответ

4

Вы можете попытаться подключиться к серверу явно путем вызова Socket.connect(address, timeout).

Socket kkSocket = new Socket(); 
kkSocket.bind(null)/ // bind socket to random local address, but you might not need to do this 
kkSocket.connect(new InetSocketAddress(iIPv4+i, port), 500); //timeout is in milliseconds 
+0

Спасибо за предложение, попробую! – David

+0

Он работает! Благодаря! – David

3

Вы можете создать не связанную сокет с помощью конструктора noarg Socket(), а затем вызвать connect(SocketAddress endpoint, int timeout) с малым значением тайм-аута.

+0

Спасибо, сэр! – David

+1

Тайм-аут в миллисекундах, поэтому в течение одной секунды тайм-аут должен быть равен 1000. – Gareve