2011-11-21 82 views
3

我使用Java來構建一個類中的一個簡單的方法是將抓住用戶的機器的LAN IPv4地址。對於這部分運作良好,但有一個例外... IP地址我得到的回覆是我的VirtualBox虛擬以太網適配器的IPv4地址,如被證實,當我進入ipconfig進入命令提示符:的Java getHostAddress()返回VirtualBox的IPv4地址

enter image description here

這裏是一個會搶了IP地址的方法:

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

... 

private String getIP() { 
    try { 
    return InetAddress.getLocalHost().getHostAddress(); 
    } catch (UnknownHostException e) { 
    return "0.0.0.0"; 
    } 
} 

任何人都可以請告訴我如何解決此問題?我想避免假設最終用戶不會安裝VirtualBox(或類似的東西)。

謝謝你的時間。

+0

不是這個有點http://stackoverflow.com/questions/7348711/recommended-way-to-get-hostname-in-java/7353473#7353473的副本嗎? –

+0

不完全。他們正在尋找hostName。我正在尋找hostAddress。 –

+0

我能夠得到我的hostName很好...... –

回答

5

我認爲你需要看看NetworkInterface類,看是否它會幫助你排除在這種情況下,虛擬接口:

for (NetworkInterface networkInterface : Collections.list(NetworkInterface.getNetworkInterfaces())) { 
     //Perhaps networkInterface.isVirtual() will help you identify the correct one? 
    } 

我不會對我的設置的任何虛擬接口,所以我無法分辨它的工作原理,但我希望能給你一個指示。

+0

謝謝。我會研究這個,讓你知道我的結果! –

+0

優秀!通過使用你的和prunge的建議的修改版本,我能夠得到並解析這個語句的輸出,直到我只剩下我的局域網IP地址。謝謝! –

1

從使用NetworkInterface類,以我的經驗isVirtual的伊沙伊的建議繼()沒有VM網卡和「正常」的人區別開來。

但你可以抓住使用NetworkInterface.getHardwareAddress()的MAC地址,並做一些模式匹配猜測網絡接口是否是虛擬機。有關常見虛擬機MAC地址模式,請參閱this page

誰也不能保證這種技術將工作,因爲大多數虛擬機軟件,用戶可以明確設置的MAC地址的網絡適配器。但是,在大多數情況下,用戶只會得到虛擬機軟件來生成一個,所以這些模式應該覆蓋大部分情況。