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

Java getLocalHost和getByName(“localhost”)的IP地址不同……为什么会这样?,java,inetaddress,Java,Inetaddress,在什么情况下,InetAddress.getLocalHost().getHostAddress()返回的IP地址与InetAddress.getByName(“localhost”)不同 在我的系统上,一个返回192.168.0.2,而另一个返回127.0.0.1,具体如下: “[InetAddress.getLocalHost()]返回本地主机的地址。这是通过从系统中检索主机名,然后将该名称解析为InetAddress来实现的。 注意:解析的地址可能会在短时间内缓存 如果存在安全管理器,将使

在什么情况下,
InetAddress.getLocalHost().getHostAddress()
返回的IP地址与
InetAddress.getByName(“localhost”)
不同

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

,具体如下:

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

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

可能是因为您的安全管理器不允许您使用本地子网的
192
地址进行连接,所以您得到了


InetAddress.getByName(“localhost”)
justs要求操作系统执行名称解析。

看起来,InetAddress.getLocalHost().getHostAddress()正在返回系统ip和InetAddress。getByName(“localhost”)返回环回地址

根据getByName()的InetAddress API规范,我怀疑帕提亚针对getByName描述的安全管理器案例:

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

而getLocalHost()不会引发任何此类异常,而是将环回地址作为故障保护返回。

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

请澄清您的问题:哪一个返回了什么?如果您在浏览器上键入,或者您将始终从进行连接的计算机连接。它就像一个别名,用来指代您所在的机器。例如,这是一个非常方便的开发技巧。当您询问“可见”IP时,您是在询问系统,另一台计算机应该连接到哪个地址才能连接到您的机器。请注意,这可能是一个专用IP(与您的一样),因此仅对同一网络中的计算机有效。所以,这两个结果都是正确的,你只需要知道你打算用IP做什么。所以,这两个都是你的地址,但实际上你只能连接其中一个——我想。当然,你会想检查一下。