为什么当InetAddress.getLocalHost().getHostAddress
返回与InetAddress.getByName("localhost")
为什么他们两个都没有返回?一个正在返回192.168.0.2
而另一个正在返回127.0.0.1
答案 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。