2013-07-31 238 views
4

我在寻找一个更好的办法让我的局域网网络中使用Java计算机名称。我曾尝试过:获得网络计算机名称

byte[] ip = {(byte)192,(byte)168,(byte)178,(byte)1}; 
    for(int i=1;i<255;i++) 
    { 
     ip[3] = (byte)i; 
     try 
     { 
      InetAddress addr = InetAddress.getByAddress(ip); 
      String s = addr.getHostName(); 
      System.out.println(s); 
     } 
     catch(UnknownHostException e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } 

...但它太慢了。有没有其他方法?

我在Windows上。

任何想法表示赞赏。

+4

速度有多慢?你想要多快? –

+0

反向dns本质上很慢。并不是所有的IP都有反向映射,并且一般来说,如果一个块中的一个IP没有反向,那么其余的也不会有任何反向。 –

+0

线程应该让你在这加速了很远,但在其他方面你的表现是在你的DNS服务器和网络 –

回答

8

您可以通过使用多线程提高速度。

让每个线程执行你的“尝试”块的迭代的一个或多个。

+0

感谢“我会给一个尝试 – user1380282

+0

这确实有助于再次加快速度感谢:) – user1380282

+0

@ user1380282太好了!很高兴有帮助。 –

2

对于那些谁正在琢磨,这是我想出来的:

import java.net.InetAddress; 
import java.net.UnknownHostException; 

public class nameLookup implements Runnable 
{ 
    byte[] ip; 
    String[] names; 
    int index; 
    public nameLookup(byte[] ip,int index,String[] names) 
    { 
     this.ip = ip; 
     this.names = names; 
     this.index = index; 
    } 
    public void run() 
    { 
     try 
     { 
      InetAddress addr = InetAddress.getByAddress(ip); 
      names[index]= addr.getHostName(); 

     } 
     catch(UnknownHostException e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } 
    public static String[] lookUp() 
    { 
     byte[] ip = {(byte)192,(byte)168,(byte)178,(byte)1}; 
     String[] names = new String[254]; 
     Thread threads[] = new Thread[254]; 

     for(int i=0;i<254;i++) 
     { 
      ip[3] = (byte)(i+1); 
      threads[i] = new Thread(new nameLookup(ip,i,names)); 
      threads[i].start(); 
     } 
     for(int i=0;i<254;i++) 
     { 
      try 
      { 
       threads[i].join(); 
      } 
      catch (InterruptedException e) { 
       System.out.print(e.getMessage()); 
      } 

     } 
     return names; 
    } 
} 

我还是希望它是快,但现在至少是可以接受的。