Java InetAddress.getAllByName()不按广告的方式工作?

Java InetAddress.getAllByName()不按广告的方式工作?,java,Java,以下代码段仅返回一个带有我的主机名和环回地址127.0.1.1的InetAddress: InetAddress[] allAddresses = InetAddress.getAllByName(host); assert allAddresses.length == 1; assert allAddresses[0].isLoopbackAddress(); 但是,我可以找到我的非环回IP,如下所示: Enumeration<NetworkInterface> networkI

以下代码段仅返回一个带有我的主机名和环回地址127.0.1.1的InetAddress:

InetAddress[] allAddresses = InetAddress.getAllByName(host);
assert allAddresses.length == 1;
assert allAddresses[0].isLoopbackAddress();
但是,我可以找到我的非环回IP,如下所示:

Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
for (Enumeration<NetworkInterface> e = networkInterfaces; e.hasMoreElements();) {
  NetworkInterface networkInterface = e.nextElement();
  Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
  for (Enumeration<InetAddress> eAddresses = inetAddresses; eAddresses.hasMoreElements();) {
    InetAddress address = eAddresses.nextElement();
    if (!address.isLoopbackAddress()) {
      return address;
    }
  }
}
枚举networkInterfaces=NetworkInterface.getNetworkInterfaces(); 对于(枚举e=networkInterfaces;e.hasMoreElements();){ NetworkInterface NetworkInterface=e.nextElement(); 枚举inetAddresses=networkInterface.getInetAddresses(); 对于(枚举eadAddresses=inetAddresses;eadAddresses.hasMoreElements();){ InetAddress=eadAddresses.nextElement(); 如果(!address.isLoopbackAddress()){ 回信地址; } } } 此外,我能够使用nslookup将主机名解析为非环回IP


InetAddress.getAllByName()声明“给定主机名,根据系统上配置的名称服务返回其IP地址数组。”我是否缺少配置步骤?

对于此方法,至少在Linux上,操作系统将从/etc/hosts读取值,如果发现任何内容,将返回它。 And/etc/hosts可能只有

127.0.0.1 yourhostname

在您的系统上。

在这种情况下,获得所需行为的唯一方法是使用类似dnsjava的东西:

下面的代码解决了这个问题

InetAddress[] allAddresses = org.xbill.DNS.Address.getAllByName(host);

断言allAddresses.length==1;为什么要这样做?只是为了说明getAllByName()只返回长度为1的数组。谢谢,我可以确认这个行为。如果我向/etc/hosts添加另一个IP地址,它就会显示出来。然而,基于javadoc,听起来我应该能够获得与nslookup相同的IP信息。是的,这看起来像是一个文档错误。它可能会向操作系统请求它(
基于系统上配置的名称服务
)。操作系统会返回它认为正确的内容。但是系统上配置的名称服务不一定是nslookup。如果操作系统已经有了答案,那么进行ns查找是没有意义的。