【问题标题】:Does InetAddress.getLocalHost().getHostAddress(); involve DNS-Server?InetAddress.getLocalHost().getHostAddress();涉及DNS服务器?
【发布时间】:2011-11-15 08:58:48
【问题描述】:

使用以下代码

InetAddress.getLocalHost().getHostAddress();

可以获取主机地址。但是 JVM 是如何发现的呢?

Java API 只告诉您它返回它 (API Reference),但是否涉及 DNS-Server,如果是,何时调用?

如果只调用一次,服务器名称如何保存在本地?

【问题讨论】:

  • 顺便说一句,依赖你的主机只有一个地址有点危险。大多数系统都有例如具有多个地址的自动配置 IPv6 堆栈。

标签: java dns ip host


【解决方案1】:

实际实现是使用 JNI 以本机代码完成的,因此它会因平台而异。

也就是说,没有理由需要通过 DNS 来查找网卡所在机器上的 IP 地址。可以直接从网卡读取ip信息。

坏消息:无法确定这是否会在运行 Java 的任何平台上进行 DNS 查找,因为它是本机代码,并且机器是否有可能进行 DNS 查找,即使它是实际上没有必要存在。

好消息:在我的 linux 机器上,它不进行 DNS 查找(通过 wireshark 确认),这正是我所期望的。如果您认为它正在执行查找,那么它可能正在执行查找的原因有很多(取决于您的本机绑定客户端的可配置性),如果您安装了 wireshark(或使用合适的网络分析器),您可以快速找出如果你正在寻找自己。

编辑:请注意,如果要查找名称,则名称查找将位于链接调用的 .getLocalHost() 部分。

【讨论】:

  • 为什么你认为它是一种本地方法是相关的?即使该方法是用 Java 实现的,您也不能依赖特定的行为,除非它在 ​​API 文档中指定。
  • 原生方法没有单一的具体实现,而是每个平台都有一个实现。这意味着要知道代码永远不会进行 DNS 查找,需要知道没有人曾经编写(或将编写)最终返回到进行 DNS 查找的实现。那是不可能的,Java 行为很清楚调用要提供什么,但不清楚如何完成。有些人可能会在一个平台上实现它,该平台倾向于在真正需要之前选择 DNS 解决方案。
  • 标准 Java API 中的任何方法都没有一个特定的实现。方法是原生的还是用 Java 实现的,这无关紧要。
【解决方案2】:

InetAddress(特别是InetAddress.getLocalHost()的结果)代表一个IP地址,getHostAddress()返回它的文本表示,因此它不需要DNS查找。

如果您需要主机名,可以致电getHostName() - 它可能会执行反向 DNS 查找:

如果这个 InetAddress 是用一个主机名创建的,这个主机名将被记住并返回;否则,将执行反向名称查找,并根据系统配置的名称查找服务返回结果。如果需要查找名称服务,请调用 getCanonicalHostName。

【讨论】:

    【解决方案3】:

    InetAddress.getLocalHost() 并没有像大多数人认为的那样做。它实际上返回机器的主机名,以及与该主机名关联的 IP 地址。这可能是用于连接外部世界的地址。它可能不会。这仅取决于您如何配置系统。

    在我的 windowsbox 上,它获取机器名称和外部 IP 地址。在我的 linux 机器上,它返回主机名和 127.0.0.1,因为我在 /etc/hosts 中设置了它

    此处不使用 DNS 服务器。

    【讨论】:

      猜你喜欢
      • 2019-05-20
      • 1970-01-01
      • 2012-02-26
      • 2019-09-10
      • 1970-01-01
      • 2019-10-13
      • 2016-03-23
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多