Получение имени хоста с java не удается в последнем jdk7

Я получил имя хоста машины следующим образом:

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 без проблем.

Есть ли лучший способ сделать эту работу?

Ответ 1

Ну, я подумал о том, чтобы помечать это как дуп, но единственные ответы, которые я нахожу, предлагают использовать InetAddress.getLocalHost().getHostName(). Который, честно говоря, я думаю, должен вернуть "localhost" в этом случае. И эти ответы, я полагаю, правильны, поскольку на самом деле нет чистого Java-способа сделать это (по крайней мере, это не переносится обратно в старые JRE).

Мы используем JNI для этого. Мы называем SCPreferencesGetHostName() в Mac OS 10.4+, SCDynamicStoreCopyLocalHostName() на старой Mac OS, GetComputerName() на Win32, gethostname() везде.

Вы могли бы, конечно, просто вызвать /bin/hostname на машинах Unix или посмотреть на переменную среды COMPUTERNAME на Windows. Это своего рода призыв к суждению о том, лучше ли вам звонить JNI или exec в другую программу.

Для того, что стоит, причина, по которой мы не вызываем gethostname() в Mac OS, заключается в том, что Mac делает странное динамическое имя хоста, где gethostname() вернет обратный DNS вашего основного Ethernet-устройства. Если бы я подключил свой Mac прямо к моему кабельному модему, я получил бы имя хоста customer-10-42-21-42 или то, что мой провайдер кабельного телевидения решил установить как мою запись PTR в своем DNS. Вместо этого переход к настройкам даст вам стабильное имя хоста, которое было определено пользователем.

Ответ 2

У меня была такая же проблема, и когда все это выстроилось, это сработало. имя хоста должно быть добавлено с локальным DOT

$ 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)

Ответ 4

Если вы не против использования внешней зависимости от центра maven, я написал gethostname4j, чтобы решить эту проблему для себя. Он просто использует JNA для вызова функции libc gethostname (или получает имя компьютера в Windows) и возвращает ее вам как строку.

https://github.com/mattsheppard/gethostname4j

@edward-thomson отвечает выше, делает мне что-то, что у меня может быть немного больше работы, чтобы он работал хорошо на MacOS, хотя:)