getLocalHost和getByName(“localhost”)的不同IP地址..为什么会这样?

时间:2014-06-04 12:28:29

标签: java inetaddress

为什么当InetAddress.getLocalHost().getHostAddress返回与InetAddress.getByName("localhost")

不同的输出时

为什么他们两个都没有返回?一个正在返回192.168.0.2而另一个正在返回127.0.0.1

2 个答案:

答案 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()不会抛出任何此类异常,但会将loopback地址作为failafe返回。 http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#getLocalHost%28%29

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

答案 1 :(得分:0)

根据this

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

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

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

无论如何,

InetAddress.getByName("localhost")只是要求操作系统执行名称解析from what I can tell