1

在什么情况下会InetAddress.getLocalHost().getHostAddress()返回不同的 IP 地址InetAddress.getByName("localhost")

在我的系统上,一个返回192.168.0.2而另一个返回127.0.0.1

4

2 回答 2

1

似乎, InetAddress.getLocalHost().getHostAddress() 正在返回您的系统 ip 和 InetAddress.getByName("localhost") 环回地址。

我怀疑 Parthian 为 getByName 描述的安全管理器案例,
根据 getByName() 的 InetAddress API 规范:http: //docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#getByName% 28java.lang.String%29

该方法抛出: SecurityException - 如果安全管理器存在并且其 checkConnect 方法不允许该操作。

而 getLocalHost() 不会抛出任何此类异常,而是将环回地址作为故障安全返回。 http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#getLocalHost%28%29

getByName() 需要连接到 DNS 来解析主机名。在这种情况下,getByName() 是从 /etc/hosts(linux) 或 C:\Windows\System32\drivers\etc (windows) 解析“localhost”。主机名 ip 对是用户可在这些文件中配置的。要检查,您可以向 localhost 提供任何值,例如:hosts 文件中的 localhost 127.0.0.2,getByName 将返回它。

于 2014-06-04T13:37:10.467 回答
0

据此:_

"[ InetAddress.getLocalHost()] 返回本地主机的地址。这是通过从系统中检索主机的名称,然后将该名称解析为 InetAddress 来实现的。注意:解析的地址可能会被缓存一小段时间。

如果有安全管理器,则使用本地主机名和 -1 作为其参数调用其 checkConnect 方法,以查看是否允许该操作。如果不允许该操作,则返回表示环回地址的 InetAddress。”

可能发生的事情是您获得了环回地址,因为您的安全管理器不允许您使用本地子网的192地址进行连接。

InetAddress.getByName("localhost")无论如何,justs 要求操作系统执行名称解析,据我所知

于 2014-06-04T12:49:30.663 回答