一尘不染

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

java

以下哪种方法是用Java获取当前计算机的主机名的最佳,最便捷的方法?

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

InetAddress.getLocalHost().getHostName()

阅读 458

收藏
2020-03-13

共1个答案

一尘不染

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

InetAddress.getLocalHost().getHostName()

在某些情况下注定会失败:

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

另外,请勿将IP地址的名称与主机名(主机名)混淆。隐喻可能更清楚:

有一个大城市(服务器),称为“伦敦”。在城墙内,发生了很多生意。这个城市有几个门(IP地址)。每个闸门都有一个名称(“北闸门”,“河闸门”,“南安普敦闸门” …),但是闸门的名称不是城市的名称。同样,你无法通过使用大门的名称来推断城市的名称-“北门”将覆盖一半的较大城市,而不仅仅是一个城市。但是-一个陌生人(IP数据包)沿着河边走,问当地人:“我有一个陌生的地址:’河门,左第二,第三宫’。你能帮我吗?” 当地人说:“当然,你在正确的道路上,只需继续前进,你将在半小时内到达目的地。”

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

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

如果还有其他情况,则必须使用此配置设置的确定来源-C函数gethostname(2)。该函数也由程序调用hostname

2020-03-13