在什么情况下会InetAddress.getLocalHost().getHostAddress()
返回不同的 IP 地址InetAddress.getByName("localhost")
?
在我的系统上,一个返回192.168.0.2
而另一个返回127.0.0.1
在什么情况下会InetAddress.getLocalHost().getHostAddress()
返回不同的 IP 地址InetAddress.getByName("localhost")
?
在我的系统上,一个返回192.168.0.2
而另一个返回127.0.0.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 将返回它。
据此:_
"[ InetAddress.getLocalHost()
] 返回本地主机的地址。这是通过从系统中检索主机的名称,然后将该名称解析为 InetAddress 来实现的。注意:解析的地址可能会被缓存一小段时间。
如果有安全管理器,则使用本地主机名和 -1 作为其参数调用其 checkConnect 方法,以查看是否允许该操作。如果不允许该操作,则返回表示环回地址的 InetAddress。”
可能发生的事情是您获得了环回地址,因为您的安全管理器不允许您使用本地子网的192
地址进行连接。
InetAddress.getByName("localhost")
无论如何,justs 要求操作系统执行名称解析,据我所知。