使用以下代码
InetAddress.getLocalHost().getHostAddress();
可以获取主机地址。但是JVM如何找到它呢?
Java API仅告诉您它返回它(API Reference),但是是否涉及DNS服务器,如果是,则何时调用它?
如果只调用一次服务器名称如何在本地保存?
答案 0 :(得分:6)
实际的实现是使用JNI在本机代码中完成的,因此它在平台之间会有所不同。
也就是说,没有理由需要DNS来查找网卡所在机器上的IP地址。人们可以从网卡上读取ip信息。
坏消息:没有办法确定这是否会在Java运行的任何平台上进行DNS查找,因为它是本机代码,并且机器可以进行DNS查找,即使它是实际上并不存在。
好消息:在我的linux机器上,它没有进行DNS查找(通过wireshark确认),这正是我所期望的。如果您认为它正在进行查找,那么可能有多种原因可以进行查找(取决于您的本机绑定客户端的可配置性),如果您安装wireshark(或使用合适的网络分析器),您可以快速找到如果你自己抬头。
编辑:请注意,如果要对其进行查找,则名称查找将位于已链接的调用的.getLocalHost()
部分中。
答案 1 :(得分:0)
InetAddress
(特别是InetAddress.getLocalHost()
的结果)表示IP地址,getHostAddress()
返回其文本表示,因此不需要DNS查找。
如果您需要主机名,可以拨打getHostName()
- 它可以执行反向DNS查询:
如果使用主机名创建此InetAddress,则将记住并返回此主机名;否则,将执行反向名称查找,并将根据系统配置的名称查找服务返回结果。如果需要查找名称服务,请调用getCanonicalHostName。
答案 2 :(得分:0)
InetAddress.getLocalHost()并没有像大多数人认为的那样做。它实际上返回了机器的主机名,以及与该主机名关联的IP地址。这可能是用于连接外部世界的地址。它可能不会。这取决于您如何配置系统。
在我的Windowsbox上,它获取了机器名称和外部IP地址。在我的linux机器上它返回主机名和127.0.0.1因为我在/ etc / hosts
中设置了它此处不涉及使用DNS服务器。