10

我一直在获取机器的主机名,如下所示:

InetAddress.getLocalHost().getHostName();

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

127.0.0.1    localhost    redbull

它一直在返回 REDBULL 直到升级。所以我改变了周围的推杆

127.0.0.1    redbull    localhost

相反,它开始毫无问题地返回 REDBULL。

有没有更好的方法来完成这项工作?

4

4 回答 4

3

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

我们使用 JNI 来实现这一点。我们调用SCPreferencesGetHostName()Mac OS 10.4+、SCDynamicStoreCopyLocalHostName()旧版 Mac OS、GetComputerName()Win32 以及gethostname()其他任何地方。

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

对于它的价值,我们不调用gethostname()Mac OS 的原因是因为 Mac 做了一个奇怪的动态主机名事情,gethostname()它将返回你的主要以太网设备的反向 DNS。如果我将我的 Mac 直接插入我的电缆调制解调器,我会得到一个主机名,customer-10-42-21-42或者我的电缆提供商决定在他们的 DNS 中设置为我的 PTR 记录的任何内容。相反,转到首选项将为您提供由用户确定的稳定主机名。

于 2012-05-10T22:23:53.147 回答
3

如果你不反对使用来自 maven Central 的外部依赖,我写了 gethostname4j 来为自己解决这个问题。它只是使用 JNA 调用 libc 的 gethostname 函数(或在 Windows 上获取 ComputerName)并将其作为字符串返回给您。

https://github.com/mattsheppard/gethostname4j

@edward-thomson 上面的回答让我觉得我可能需要做更多的工作才能让它在 MacOS 上运行良好:)

于 2017-01-08T19:14:34.553 回答
2

我遇到了同样的问题,当以下所有内容排成一行时,它就起作用了。主机名必须附加 DOT local

$ scutil --get HostName
drums
$ scutil --get LocalHostName
drums
$ scutil --get ComputerName
drums

$ sudo hostname drums.local
$ hostname
drums.local

$sudo vim /etc/hosts
192.168.x.IP drums
127.0.0.1 localhost drums
255.255.255.255 broadcasthost
::1 localhost
fXXX::1XXX localhost

$networksetup -setv6off Ethernet

$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.9

$ java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
于 2013-11-11T21:50:00.507 回答
0

这是 JDK7u4 的 macosx 端口中的一个已知问题。

http://java.net/jira/browse/MACOSX_PORT-564

于 2012-06-11T21:01:16.327 回答