所以,我试图让我的机器在我的本地网络(应该是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