【发布时间】:2012-02-04 15:20:56
【问题描述】:
所以,我正在尝试在本地网络中获取我的机器的 IP 地址(应该是 192.168.178.41)。
我的第一个意图是使用这样的东西:
InetAddress.getLocalHost().getHostAddress();
但它只返回127.0.0.1,这是正确的,但对我帮助不大。
我四处搜索并找到了这个答案https://stackoverflow.com/a/2381398/717341,它只是创建了一个Socket-连接到某个网页(例如“google.com”)并从套接字获取本地主机地址:
Socket s = new Socket("google.com", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();
这确实适用于我的机器(它返回192.168.178.41),但它需要连接到互联网才能工作。由于我的应用程序不需要互联网连接,而且每次启动时应用程序都会尝试连接到 google 看起来“可疑”,所以我不喜欢使用它。
所以,经过更多研究后,我偶然发现了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) 的含义。
此外,我还没有找到一种方法从返回的地址中过滤它(通过使用InetAddress-object 的isXX()-方法),然后使用 RegEx,我发现它非常“脏”。
除了使用 RegEx 或互联网之外,还有其他想法吗?
【问题讨论】:
-
fe80:0:0:0:226:4aff:fe0d:592e 看起来像 IPv6 地址
-
fe80::...是 IPv6 链路本地地址 -
顺便问一下,你想“过滤”什么?当然,您知道机器可以是多宿主的吗?
标签: java networking ip