Java的getHostAddress()返回VirtualBox的IPv4地址。

6
我正在使用Java构建一个简单的方法,该方法位于类中,将获取用户计算机的LAN IPv4地址。大部分情况下,这很有效,只有一个例外...我得到的IP地址是我的VirtualBox以太网适配器的IPv4地址,当我在命令提示符中输入ipconfig时可以证明:

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(或类似的软件)。

感谢您的时间。


这不是 https://dev59.com/OGs05IYBdhLWcg3wQvuq#7353473 的重复吗? - Arnout Engelen
不太对。他们在寻找主机名。我在寻找主机地址。 - Oliver Spryn
我成功地获取了我的主机名... - Oliver Spryn
然而,适用于获取主机名的评论也适用于获取主机地址。基本上,你无法获取,因为你的计算机可能有多个地址,或者可能被外部某个地址所知,甚至在计算机本身上也看不到(例如使用NAT时)。 - Arnout Engelen
2个回答

6

我想你需要查看NetworkInterface类,看它是否能帮助你在这种情况下排除虚拟接口:

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

我设置中没有任何虚拟接口,所以无法告诉您它的工作效果如何,但我希望这能给您一个指引。


谢谢。我会研究一下并告诉您我的结果! - Oliver Spryn
太棒了!通过使用您和prunge的建议的修改版本,我能够获取并解析该语句的输出,直到只剩下我的局域网IP地址。谢谢! - Oliver Spryn

1

继Yishai建议使用NetworkInterface类后,我的经验是isVirtual()无法区分虚拟机网络适配器和“普通”适配器。

但是,您可以使用NetworkInterface.getHardwareAddress()获取MAC地址,并进行一些模式匹配来猜测网络接口是否用于虚拟机。请参见this page以获取常见的虚拟机MAC地址模式。

不能保证此技术将起作用,因为大多数VM软件允许用户明确设置网络适配器的MAC地址。但是,在大多数情况下,用户只需让VM软件生成一个地址,因此这些模式应该涵盖大多数情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接