2014-06-06 68 views
0

我想在我的网络中查找我的服务器,当时我不知道该IP。 所以这是我的代码,但它需要很长的测试所有IP(!):Java - 在网络中查找服务器

for (int j = 1; j < 255; j++) { 
    for (int i = 1; i < 255; i++) { 
     String iIPv4 = "192.168." + j + "."; 
     try { 
      Socket socket = new Socket(); 
      SocketAddress address = new InetSocketAddress(iIPv4 + i, 2652); 
      socket.connect(address, 5); 
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      String fromServer; 
      while ((fromServer = in.readLine()) != null) { 
      if (fromServer.equals("Connected to CC3000")) { 
       System.out.println("CC3000 found! : " + iIPv4 + i); 
       return iIPv4 + i; 
      } 
      } 
     } catch (UnknownHostException e) { 
     } catch (IOException e) { 
     } 
    } 
} 

所以,什么更好的方法来查找服务器?

问候

+0

如果您知道服务器的主机名和域,可以直接使用它。 –

+0

这将需要很长时间!您正试图对每个主机执行TCP连接。让服务器监听广播/多播数据包并做出响应(假设本地局域网 - 类似于UPnP的工作原理),怎么办?失败的DNS? – chrixm

+0

@RomanC我知道,但我想让它变得动态。 – maysi

回答

0

我认为多线程可以帮助你在这里,因为你不想在等待每个连接要么建立或失败。

你可以尝试一次说数百个套接字。同时检查IP是否可达可能会为您节省一些时间。

下面的代码实际上是一个天真和可怕的例子,因为根本没有线程管理,但你得到了我希望的图片。你应该更快地得到结果。

public static void findLanSocket(final int port, final int timeout) { 
    List<Thread> pool = new ArrayList<>(); 

    for (int j = 1; j < 255; j++) { 
     for (int i = 1; i < 255; i++) { 
      final String iIPv4 = "192.168." + j + "." + i; 

      Thread thread = new Thread(new Runnable() { 

       @Override 
       public void run() { 
        System.out.println("TESTING: " + iIPv4); 

        try { 
         // First check if IP is reachable at all. 
         InetAddress ip = InetAddress.getByName(iIPv4); 
         if (!ip.isReachable(timeout)) { 
          return; 
         } 

         // Address is reachable -> try connecting to socket. 
         Socket socket = new Socket(); 
         SocketAddress address = new InetSocketAddress(ip, port); 
         socket.connect(address, timeout); 

         BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
         String fromServer; 
         while ((fromServer = in.readLine()) != null) { 
          if (fromServer.equals("Connected to CC3000")) { 
           System.out.println("CC3000 found! : " + iIPv4); 
          } 
         } 

        } catch (UnknownHostException e) { 
        } catch (IOException e) { 
        } 
       } 
      }); 

      pool.add(thread); 
      thread.start(); 
     } 
    } 

    // Wait for threads to die. 
    for (Thread thread : pool) { 
     try { 
      if (thread.isAlive()) { 
       thread.join(); 
      } 
     } catch (InterruptedException ex) { 
     } 
    } 
}