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

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

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

InetAddress.getLocalHost().getHostName()


答案 1

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

InetAddress.getLocalHost().getHostName()

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

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

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

有一个大城市(服务器)叫做“伦敦”。在城墙内,很多生意都发生了。这个城市有几个大门(IP地址)。每个门都有一个名字(“北门”,“河门”,“南安普敦门”...),但门的名称不是城市的名称。此外,您也无法通过使用门的名称来推断城市的名称 - “北门”将捕获一半的大城市,而不仅仅是一个城市。然而 - 一个陌生人(IP数据包)沿着河边走,问当地人:“我有一个奇怪的地址:'河门,左二,第三宫'。你能帮帮我吗?当地人说:“当然,你走在正确的路上,只要继续前进,你就会在半小时内到达目的地。

我认为这几乎说明了这一点。

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

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


答案 2

InetAddress.getLocalHost().getHostName()是更便携的方式。

exec("hostname")实际上调用操作系统来执行命令。hostname

以下是关于SO的其他几个相关答案:

编辑:您应该查看A.H.的答案Arnout Engelen的答案,以了解为什么这可能无法按预期工作的详细信息,具体取决于您的情况。作为这个专门要求便携式的人的答案,我仍然认为很好,但是他们提出了一些应该考虑的好点。getHostName()


推荐