获取网络计算机名称

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
有多慢才算慢?你想要有多快呢? - Colin D
反向 DNS 本质上是很慢的。并非所有 IP 都有反向映射,一般来说,如果一个块中的一个 IP 没有反向映射,那么其他 IP 也很可能没有反向映射。 - Marc B
线程应该可以在加速这个过程中帮助你取得很大的进展,但如果不使用线程,你的性能将完全取决于你的DNS服务器和网络。 - Eric Petroelje
我认为可能有一些技巧或黑客方法可以绕过实际上访问每个可能的IP地址(转到您连接的路由器并检索信息)。但也许Java不行。 - asteri
我在考虑文件选择对话框,它是如何获取网络中的计算机名称的?它非常快速。 - user1380282
2个回答

8

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

让每个线程执行您的“try”块中的一个或多个迭代。


谢谢,我会尝试的。 - user1380282
@user1380282 很好!很高兴能够帮助到您。 - Colin D

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;
    }
}

我仍然希望它更快,但现在至少可以接受。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接