在最新的jdk7中,使用java获取主机名失败

Dan*_*iil 10 java

我一直在获得机器的主机名如下:

InetAddress.getLocalHost().getHostName();
Run Code Online (Sandbox Code Playgroud)

但是,当我放入最新的JDK(jdk1.7.0_04)时,上面的代码只返回LOCALHOST.我检查了/ etc/hosts(它的linux),它说:

127.0.0.1    localhost    redbull
Run Code Online (Sandbox Code Playgroud)

在升级之前它一直在返回REDBULL.所以我把它改成了

127.0.0.1    redbull    localhost
Run Code Online (Sandbox Code Playgroud)

相反,它开始返回REDBULL没有问题.

是否有更好的方法使这项工作?

Edw*_*son 3

好吧,我考虑过将其标记为重复,但我找到的唯一答案建议您使用 InetAddress.getLocalHost().getHostName(). 坦率地说,我认为在这种情况下应该返回“localhost”。我认为这些答案是正确的,因为实际上没有纯 Java 方法可以做到这一点(至少没有可以移植回旧版 JRE 的方法)。

我们使用 JNI 来完成此任务。我们SCPreferencesGetHostName()在 Mac OS 10.4+、SCDynamicStoreCopyLocalHostName()旧版 Mac OS、GetComputerName()Win32 以及gethostname()其他任何地方调用。

当然,您可以简单地/bin/hostname在 Unix 机器上调用或查看COMPUTERNAMEWindows 上的环境变量。这是一种判断调用,判断您是否觉得调用 JNI 或exec调用另一个程序更好。

无论如何,我们不在gethostname()Mac OS 上调用的原因是因为 Mac 执行了一个奇怪的动态主机名操作,其中gethostname()将返回主要以太网设备的反向 DNS。如果我将 Mac 直接插入电缆调制解调器,我将获得主机名customer-10-42-21-42或电缆提供商决定在其 DNS 中设置为我的 PTR 记录的任何内容。相反,转到首选项将为您提供由用户确定的稳定主机名。