Получение имени компьютера в 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, если бы вам нужна дополнительная надежность.