在 Java 中获取主机名的推荐方法

新手上路,请多包涵

以下哪项是用 Java 获取当前计算机主机名的最佳和最便携的方法?

Runtime.getRuntime().exec("hostname")

对比

InetAddress.getLocalHost().getHostName()

原文由 Mahendra 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 994
1 个回答

严格来说 - 你别无选择,只能调用 hostname(1) 或 - 在 Unix 上 gethostname(2) 。这是您的计算机的名称。任何通过这样的 IP 地址确定主机名的尝试

InetAddress.getLocalHost().getHostName()

在某些情况下必然会失败:

  • IP 地址可能无法解析为任何名称。错误的 DNS 设置、错误的系统设置或错误的提供商设置可能是造成这种情况的原因。
  • DNS 中的名称可以有许多称为 CNAME 的别名。这些只能在一个方向上正确解决:名称到地址。反向方向不明确。哪个是“官方”名称?
  • 一台主机可以有很多不同的 IP 地址——每个地址可以有很多不同的名字。两种常见情况是:一个以太网端口有多个“逻辑”IP 地址,或者计算机有多个以太网端口。它们是共享 IP 还是具有不同的 IP 是可配置的。这称为“多宿主”。
  • DNS 中的一个名称可以解析为多个 IP 地址。并非所有这些地址都必须位于同一台计算机上! (用例:负载均衡的一种简单形式)
  • 我们甚至不要开始谈论动态 IP 地址。

也不要将 IP 地址的名称与主机名 (hostname) 混淆。一个比喻可能更清楚:

有一个叫做“伦敦”的大城市(服务器)。城墙内有很多生意。这个城市有几个门(IP 地址)。每个门都有一个名字(“北门”、“河门”、“南安普敦门”……)但门的名字不是城市的名字。此外,您不能通过使用门的名称来推断城市的名称 - “北门”会覆盖一半的大城市,而不仅仅是一个城市。但是 - 一个陌生人(IP 数据包)沿着河边走,问一个当地人:“我有一个奇怪的地址:’Rivergate,第二个左,第三个房子’。你能帮我吗?”当地人说:“当然,你走对了路,只要往前走,半小时内就能到达目的地。”

我认为这很好地说明了这一点。

好消息是: 通常 不需要 真正的 主机名。在大多数情况下,在该主机上解析为 IP 地址的任何名称都可以。 (陌生人可能会从 Northgate 进入城市,但乐于助人的当地人会翻译“左二”部分。)

在其余极端情况下,您必须使用此配置设置的 最终 来源 - 即 C 函数 gethostname(2) 。该函数也被程序调用 hostname

原文由 A.H. 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题