Получение имени компьютера в Java
Мне было интересно, есть ли способ получить имя компьютера в Java? Я видел несколько ответов с функцией java.net.InetAddress
. Однако мне было интересно, есть ли способ, который не использует сеть?
(В качестве побочного вопроса, является ли имя компьютера только сетевой вещью в любом случае, поэтому так должно быть сделано так?)
Ответы
Ответ 1
"Имя" компьютера разрешено с IP-адреса базовой библиотекой DNS (Domain Name System) ОС. Нет универсальной концепции имени компьютера в ОС, но DNS обычно доступен. Если имя компьютера не настроено, поэтому DNS может его разрешить, он недоступен.
import java.net.InetAddress;
import java.net.UnknownHostException;
String hostname = "Unknown";
try
{
InetAddress addr;
addr = InetAddress.getLocalHost();
hostname = addr.getHostName();
}
catch (UnknownHostException ex)
{
System.out.println("Hostname can not be resolved");
}
Ответ 2
Я не очень волнуюсь о решении InetAddress.getLocalHost().getHostName()
, которое вы можете найти так много мест в Интернете и даже здесь. Этот метод даст вам имя хоста, как видно из сетевой перспективы. Я вижу две проблемы с этим:
-
Что делать, если хост имеет несколько сетевых интерфейсов? Хост может быть известен в сети несколькими именами. Тот, который возвращается указанным методом, является неопределенным afaik.
-
Что делать, если хост не подключен к какой-либо сети и не имеет сетевых интерфейсов?
Все ОС, которые я знаю, имеют концепцию именования node/хоста независимо от сети. Печально, что Java не может вернуть это простым способом. Это будет переменная среды COMPUTERNAME
для всех версий Windows и переменная среды HOSTNAME
в Unix/Linux/MacOS (или, альтернативно, выход из команды хозяина HOSTNAME
, если переменная среды HOSTNAME
недоступна, так как это случай в старых раковинах, таких как Борн и Корн).
Я бы написал метод, который будет извлекать (в зависимости от ОС) эти OS vars и только в качестве последнего средства использовать метод InetAddress.getLocalHost().getHostName()
. Но это только я.
ОБНОВЛЕНИЕ (Unices)
Как отмечали другие, переменная среды HOSTNAME
обычно недоступна для Java-приложения в Unix/Linux, поскольку она не экспортируется по умолчанию. Следовательно, это не надежный метод, если вы не контролируете клиентов. Это действительно отстой. Почему у этой информации нет стандартного свойства?
Увы, насколько я вижу, единственным надежным способом для Unix/Linux было бы сделать вызов JNI gethostname() или использовать Runtime.exec()
для захвата вывода из команды HOSTNAME
. Мне не нравятся какие-либо из этих идей, но если у кого-то есть лучшая идея, я все уши. (обновление: Недавно я встретил gethostname4j, который, кажется, является ответом на мои молитвы).
Длительное чтение
Я создал длинное объяснение в другом ответе на другое сообщение. В частности, вы можете прочитать его, потому что он пытается установить некоторую терминологию, дает конкретные примеры того, когда решение InetAddress.getLocalHost().getHostName()
потерпит неудачу, и указывает на единственное безопасное решение, которое я знаю в настоящее время, а именно gethostname4j.
Печально, что Java не предоставляет метод для получения имени пользователя. Голосовать за JDK-8169296, если вы в состоянии.
Ответ 3
Я согласен с peterh ответом, поэтому для тех из вас, кто любит копировать и вставлять вместо 60 секунд Googling:
private String getComputerName()
{
Map<String, String> env = System.getenv();
if (env.containsKey("COMPUTERNAME"))
return env.get("COMPUTERNAME");
else if (env.containsKey("HOSTNAME"))
return env.get("HOSTNAME");
else
return "Unknown Computer";
}
Я тестировал это в Windows 7, и он работает. Если peterh был прав, else if
должен позаботиться о Mac и Linux. Может быть, кто-то может это проверить? Вы также могли бы выполнить ответ Брайана Роуча внутри else
, если бы вам нужна дополнительная надежность.