Windows和Linux中“ 127.0.0.1”的InetSocketAddress#getHostName的不同行为

时间:2019-04-04 17:38:04

标签: java networking

InetAddress.getByName("127.0.0.1").getHostName()

上面的String在Windows中返回127.0.0.1,但在Linux中返回localhost

InetAddress#getHostName的文档说:

  

如果此InetAddress是使用主机名创建的,则该主机名将被记住并返回;否则,将执行反向名称查找,并根据系统配置的名称查找服务返回结果。

  • 这是预期的行为吗?
  • 为什么不同的操作系统会有这种差异?
  • 是不是Linux和Windows的名称查找服务不同,这就是我们在行为上看到这种差异的原因吗?

我见过this question,但是我的问题是关于Windows和Linux中API的行为差异以及这种差异的原因。

1 个答案:

答案 0 :(得分:1)

因此,Windows和Linux之间没有主要区别。不过,两者的配置有所不同。如您所参考的问题所述,它取决于hosts文件内部的内容。这是Windows和Linux上的文件,它告诉OS可以将哪些IP分配给特定的主机名。这是文件中的示例条目:

127.0.0.1    localhost

这将告诉操作系统,如果我向localhost发出请求,只需将请求路由到127.0.0.1。它与DNS服务器的操作类似,但是该过程在您的计算机上进行,而无需检查Internet。

现在,说明为什么该行在不同平台上发生变化。文档说:

  

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

本节是指hosts文件中指定的主机名。在您的Linux系统上,hosts文件具有一个类似于上述条目的条目(在Linux环境中非常常见)。 Java注意到了这一点,并返回了它而不是IP。由于Windows上没有此类条目,因此它简单地返回IP。