需要在java中以某种方式识别本地机器

时间:2011-05-17 16:19:02

标签: java hostname

我正在尝试找出运行应用程序的本地计算机的名称(或其他一种唯一标识特定计算机的方法)。

我一直在用这个:

String hostname = java.net.InetAddress.getLocalHost().getHostName();

工作正常,但我刚刚在剖析器中注意到它需要花费相当多的时间来执行它,所以我想知道是否有一些功能相似的东西运行得更快。

不必是主机名,只要它唯一标识机器就可以是任何东西。

5 个答案:

答案 0 :(得分:5)

为了唯一地识别机器,我将使用getHardwareAddress()来使用系统MAC地址。

然而,我不确定这是否会更快 - 但它绝对是唯一识别机器的更好方法。

有关示例,请参阅:http://www.java2s.com/Code/Java/Network-Protocol/GetMACaddressofahostjavanetNetworkInterfacegetHardwareAddress.htm

答案 1 :(得分:2)

您可以获取本机的MAC地址。这是一个如何获得它的例子。

byte[] mac = null;
List<NetworkInterface> interfaces = 
    (List<NetworkInterface>) Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface iface: interfaces) {
    if (!iface.isLoopback()) {
        mac = iface.getHardwareAddress();
        if (mac != null) {
            break;
        }
    }
}

此代码从第一个具有一个接口的接口上获取MAC地址。除了环回接口之外,某些机器还可能具有VPN的虚拟接口,这些接口不具有与之关联的硬件地址。

答案 2 :(得分:1)

试过getHostAddress()?从文档来看,似乎getHostName()首先涉及安全检查(如果有SecurityManager),这意味着再多一次方法调用。

答案 3 :(得分:0)

我想出了这个:

String dirname = Utils.safetrim(System.getProperty("user.dir"));

显然,世界上没有唯一识别机器但是出于我的目的它已经足够好了,因为运行这个程序的每个人都将以自己的身份登录并且可能从他们的主目录运行,因此它使得响应足够独特我

当然,它是快速的,这是重要的部分。

答案 4 :(得分:0)

只是为了保护下一个人不会遇到不完整的MAC检索代码,这是我的版本适用于我的Windows 7机器以及其他计算机。请注意,如果用户与其硬件混淆并且网络设备可能以不同的顺序返回,则代码在每次调用时仍可能返回不同的MAC。

private static final String generateHashIdentifier() throws Exception {
    Enumeration<NetworkInterface> networkInterfaces
        = NetworkInterface.getNetworkInterfaces();
    while (networkInterfaces.hasMoreElements()) {
        NetworkInterface networkInterface = networkInterfaces.nextElement();
        if (networkInterface == null
            || networkInterface.isLoopback()
            || networkInterface.isVirtual()) {
                continue;
        }
        byte[] mac = networkInterface.getHardwareAddress();
        if (mac == null || mac.length == 0)
            continue;

        StringBuilder sb = new StringBuilder();
        int zeroFieldCount = 0;
        for (int i = 0; i < mac.length; i++) {
            if (mac[i] == 0)
                zeroFieldCount++;
            sb.append(String.format("%02X%s", mac[i],
                (i < mac.length - 1) ? "-" : ""));
        }

        if (zeroFieldCount > 4)
            continue;

        return sb.toString();
    }

    throw new RuntimeException("Failed to obtain MAC");
}

在Windows中我得到了大量额外的设备,这些设备可能会也可能不会返回NULL mac或mac,其中大多数为零。代码试图找到第一个提供合理MAC的设备,并将其作为一个好的String返回作为奖励。