InetAddress.getAllByName()不像宣传的那样工作?

时间:2011-06-12 17:06:15

标签: java

以下代码段仅返回带有我的主机名和环回地址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;
    }
  }
}

此外,我可以使用nslookup将主机名解析为非环回IP。

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

2 个答案:

答案 0 :(得分:0)

对于这种方法,至少在Linux上,OS会从/ etc / hosts中读取值,如果找到任何内容,它将返回它。 而/ etc / hosts可能只有

127.0.0.1 yourhostname

在你的系统上。

答案 1 :(得分:0)

看起来在这个实例中获得所需行为的唯一方法是使用像dnsjava这样的东西:http://www.dnsjava.org/dnsjava-current/examples.html

以下解决了这个问题。

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