所以,我試圖讓我的機器在我的本地網絡(應該是192.168.178.41
)的IP地址。獲取本地IP地址而無需連接到互聯網
我的第一個目的是使用這樣的:
InetAddress.getLocalHost().getHostAddress();
但它只返回127.0.0.1
,這是正確的,但不適合我很大的幫助。
我尋找了一圈,發現這個答案https://stackoverflow.com/a/2381398/717341,它只是創建了一個Socket
-connection一些網頁(如「google.com」),並得到從插座本地主機地址:
Socket s = new Socket("google.com", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();
這對我的機器有效(它返回192.168.178.41
),但它需要連接到互聯網才能工作。由於我的應用程序不需要互聯網連接,並且它可能看起來應用程序試圖在每次啓動時連接到谷歌的「可疑」,所以我不喜歡使用它的想法。
於是,經過一些調查研究我穿過NetworkInterface
-class,(加上一些工作)不還返回所需的IP地址跌跌撞撞:
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()){
NetworkInterface current = interfaces.nextElement();
System.out.println(current);
if (!current.isUp() || current.isLoopback() || current.isVirtual()) continue;
Enumeration<InetAddress> addresses = current.getInetAddresses();
while (addresses.hasMoreElements()){
InetAddress current_addr = addresses.nextElement();
if (current_addr.isLoopbackAddress()) continue;
System.out.println(current_addr.getHostAddress());
}
}
在我的機器,這將返回以下:
name:eth1 (eth1)
fe80:0:0:0:226:4aff:fe0d:592e%3
192.168.178.41
name:lo (lo)
它找到我的網絡接口並返回所需的IP,但我不確定其他地址(fe80:0:0:0:226:4aff:fe0d:592e%3
)是什麼意思。
此外,我還沒有找到一種方法來從返回的地址(通過使用isXX()
-方法InetAddress
-對象)過濾它,然後使用正則表達式,我發現它非常「髒」。
除了使用RegEx或互聯網以外的其他想法?
FE80:0:0:0:226:4aff:fe0d:592e看起來像一個IPv6地址 – 2012-01-06 23:00:02
'FE80 :: ...'是IPv6鏈路本地ADDRES s – fge 2012-01-06 23:00:15
順便說一句,你想「過濾」什麼?當然,你知道一臺機器可以多宿主嗎? – fge 2012-01-06 23:02:01