2011-05-17 36 views
1

我想要找出運行應用程序的本地機器的名稱(或唯一標識特定機器的其他方式)。需要在java中以某種方式標識本地機器

我一直在使用這樣的:

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

,工作正常,但我剛好在探查注意到,它採取了相當多的時間來執行,所以我在想,如果有什麼事功能類似,運行速度更快。

不一定是主機名,只要它唯一標識機器就可以是任何東西。

回答

0

我想出了這一點:

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

它顯然並不世界唯一標識一個機器,但對於我而言這是不夠好,因爲運行此程序的每個人將被登錄爲自己可能是從他們的主目錄運行,所以它使得響應對我來說足夠獨特。

當然,它很快就是邪惡,這是重要的一部分。

1

試過getHostAddress()?從文檔看來,getHostName()似乎首先涉及安全檢查(如果存在SecurityManager),這意味着還有一個方法調用。

5

要唯一標識一臺機器,我將使用系統MAC地址使用getHardwareAddress()。然而,我不確定這是否會更快 - 但它絕對是唯一識別機器的更好方法。

有關示例,請參見:http://www.java2s.com/Code/Java/Network-Protocol/GetMACaddressofahostjavanetNetworkInterfacegetHardwareAddress.htm

+1

+1獲得MAC地址絕對是一個更好的方法。 – asgs 2011-05-17 16:26:16

+0

您鏈接的代碼不適合我。本地主機地址通常沒有與之關聯的網絡接口或MAC地址。 – ataylor 2011-05-17 16:52:49

+0

getLocalHost();返回與機器相關的所有IP地址。我不認爲它通常返回環回地址(127.0.0.1),但通常是您的內部網絡地址(如在.. 10.0.x.x或192.168.x.x中)。我想你應該通過每個地址,並打折127.0.0.1條目... – 2011-05-17 17:01:24

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的虛擬接口,其不具有與它們相關聯的硬件地址。

+0

表面變化:'interface'是一個保留字;)並且該方法返回笨重的Enumeration hasNext()/ nextElement()thingy。 – karmakaze 2011-05-18 01:07:04

+0

修正了破碎的代碼,謝謝你的擡頭。 – ataylor 2011-05-18 02:13:32

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返回,作爲獎勵。

相關問題