Java getHostAddress() 返回 VirtualBox IPv4 地址

Posted

技术标签:

【中文标题】Java getHostAddress() 返回 VirtualBox IPv4 地址【英文标题】:Java getHostAddress() Returning VirtualBox IPv4 Address 【发布时间】:2012-01-03 09:58:14 【问题描述】:

我正在使用 Java 在一个类中构建一个简单的方法,该方法将获取用户机器的 LAN IPv4 地址。对于大多数部分,这很好用,除了一个例外......我得到的IP地址是我的VirtualBox以太网适配器的IPv4地址,正如我在命令提示符中输入ipconfig所证明的那样:

下面是获取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(或类似的东西)。

感谢您的宝贵时间。

【问题讨论】:

这不是和***.com/questions/7348711/…有点重复吗? 不完全。他们正在寻找主机名。我正在寻找主机地址。 我能够很好地获取我的主机名... 仍然,适用于获取主机名的 cmets 也适用于获取主机地址。基本上,你不能,因为你的机器可能有多个地址,或者可能被机器本身不可见的某些地址从外部知道(例如,使用 NAT 时)。 【参考方案1】:

我认为您需要查看 NetworkInterface 类,看看它是否会帮助您在这种情况下排除虚拟接口:

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

我的设置中没有任何虚拟接口,所以我无法判断它的效果如何,但我希望能给你一个指导。

【讨论】:

谢谢。我会调查一下,让你知道我的结果! 太棒了!通过使用您和 prunge 建议的修改版本,我能够获取并解析此语句的输出,直到我只剩下我的 LAN IP 地址。谢谢!【参考方案2】:

根据 Yishai 关于使用 NetworkInterface 类的建议,根据我的经验,isVirtual() 没有区分 VM 网络适配器和“普通”网络适配器。

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

无法保证这种技术会奏效,因为大多数 VM 软件允许用户显式设置网络适配器的 MAC 地址。但是,在大多数情况下,用户只会让 VM 软件生成一个,因此这些模式应该涵盖大多数情况。

【讨论】:

以上是关于Java getHostAddress() 返回 VirtualBox IPv4 地址的主要内容,如果未能解决你的问题,请参考以下文章

Java 网络编程

InetAddress.getLocalHost().getHostAddress() 和 InetAddress.getLocalHost().getAddress() 有啥区别?

java 怎么根据指定ip获取主机的名称

Java基础(basis)-----InetAddress类

Dns.GetHostAddress(hostname) No such device or address Ubuntu 16.04 中的异常

getLocalAddress 在连接的套接字上返回 127.0.0.1