【问题标题】:Java local hostname ip resolutionJava本地主机名ip解析
【发布时间】:2016-07-05 12:15:50
【问题描述】:

我在我的 macbook pro 上遇到了一个奇怪的问题,即主机名到 ip 解析。这是代码,

import java.net.InetAddress;

public class IpRes {
  public static void main(String[] args) throws Exception {
    String host = args[0];
    InetAddress address = InetAddress.getByName(host);
    System.out.println(address.getHostAddress());
  }
}

我的主机名是“a-b-vik”。我在 /etc/hosts 中有条目

127.0.0.1 localhost
127.0.0.1 a-b-vik 

这是我运行上述程序时的输出,

java IpRes "localhost"
127.0.0.1

java IpRes "a-b-vik"
10.0.0.4

为什么主机名不解析为“127.0.0.1”?我尝试使用 -Djava.net.preferIPv4Stack=true 并得到相同的结果。我还尝试编写一个 C 程序,它似乎给出了 127.0.0.1。所以这似乎是一个 jvm 特定的问题。

奇怪的是,如果我在主机名的任何地方使用“\”,我就能让它工作。例如,

java IpRes "a-\b-vik'
127.0.0.1

具有相同 /etc/hosts 文件的相同程序可以在我朋友的 mac 上运行。不知道为什么我会面临这个问题。有什么想法吗?

【问题讨论】:

  • 在我的 macbook pro 中尝试了代码。面对同样的事情。
  • 我认为您的主机名末尾有多余的空格,请尝试使用 java IpRes "a-b-vik" 或从您的主机名中删除空格

标签: java macos dns localhost


【解决方案1】:

您的主机表无效。主机表是一种将 IP 地址映射到一个或多个名称的映射。请尝试以下操作:

127.0.0.1 localhost a-b-vik

你最后的结论是错误的。在请求java IpRes 'a-\b-vik'(或您使用的任何引号)时,您只需请求解析一个不存在的名称。

【讨论】:

  • 也试过了,还是不行。不确定这是否是问题所在。此外,如果我请求一个不存在的名称,我会得到 java.net.UnknownHostException。但是用反斜杠我不明白。
【解决方案2】:

我认为 JVM 会缓存已解析的名称。您可以通过将 networkaddress.cache.ttl 和 networkaddress.cache.negative.ttl 系统属性设置为 0 来关闭此功能。

感谢本文作者:

http://www.myhowto.org/java/42-understanding-host-name-resolution-and-dns-behavior-in-java/

【讨论】:

    猜你喜欢
    • 2014-10-13
    • 2013-03-25
    • 2011-03-12
    • 2013-01-29
    • 1970-01-01
    • 2011-05-07
    • 2019-09-29
    • 2012-04-12
    • 1970-01-01
    相关资源
    最近更新 更多