2011-02-10 14 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

タイムアウトはミリ秒であるため、1秒のタイムアウトは1000に等しくなければなりません。 – Gareve