InetAddress.getLocalHost() выдает UnknownHostException
-
18-09-2019 - |
Вопрос
Я тестирую наше серверное приложение (написанное на Java) в разных операционных системах и думаю, что OpenSolaris (2008.11) будет наименее проблематичным из-за хорошей интеграции Java.Оказывается, я был неправ, так как в итоге получил UnknownHostException.
try {
computerName = InetAddress.getLocalHost().getHostName();
if (computerName.indexOf(".") > -1)
computerName = computerName.substring(0,
computerName.indexOf(".")).toUpperCase();
} catch (UnknownHostException e) {
e.printStackTrace();
}
Результат:
java.net.UnknownHostException: desvearth01: desvearth01
at java.net.InetAddress.getLocalHost(InetAddress.java:1353)
Однако, nslookup desvearth01
возвращает правильный IP-адрес и nslookup localhost
возвращает 127.0.0.1
как и ожидалось.Кроме того, тот же код прекрасно работает во FreeBSD.Есть ли в OpenSolaris что-то особенное, о чем я не знаю?
Любые подсказки оценены, спасибо.
Решение
По доброй традиции могу еще раз ответить на свой вопрос:
Кажется, что InetAddress.getLocalHost()
игнорирует /etc/resolv.conf, а просматривает только файл /etc/hosts (где я не указал ничего, кроме localhost).Добавление IP-адреса и имени хоста в этот файл решает проблему, и исключение исчезает.
Ответ выше почти правильный, я получил подсказку сверху, и моя проблема решена... Спасибо.
Но чтобы улучшить это, я добавляю пошаговые изменения, чтобы это было полезно даже наивным пользователям.
Шаги:
Откройте /etc/hosts, записи могут выглядеть так, как показано ниже.
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
вам нужно добавить еще одну строку выше этого с помощью любого редактора, такого как vi или gedit.
<your-machine-ip> <your-machine-name> localhost
например.192.168.1.73 my_foo localhost
Теперь общий файл может выглядеть так:
192.168.1.73 my_foo localhost
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
- Просто сохраните его и снова запустите свой Java-код... и ваша работа завершена.
Другие советы
я использую NetworkInterface.getNetworkInterfaces()
как запасной вариант, когда InetAddress.getLocalHost()
бросает UnknownHostException
.Вот код (без обработки исключений для ясности).
Enumeration<NetworkInterface> iterNetwork;
Enumeration<InetAddress> iterAddress;
NetworkInterface network;
InetAddress address;
iterNetwork = NetworkInterface.getNetworkInterfaces();
while (iterNetwork.hasMoreElements())
{
network = iterNetwork.nextElement();
if (!network.isUp())
continue;
if (network.isLoopback()) // If I want loopback, I would use "localhost" or "127.0.0.1".
continue;
iterAddress = network.getInetAddresses();
while (iterAddress.hasMoreElements())
{
address = iterAddress.nextElement();
if (address.isAnyLocalAddress())
continue;
if (address.isLoopbackAddress())
continue;
if (address.isMulticastAddress())
continue;
return(address.getHostAddress());
}
}
Поиск хостов в Solaris использует /etc/nsswitch.conf
поэтому в зависимости от того, что говорит строка «hosts:», он определяет, /etc/hosts
, NIS, DNS и/или LDAP.
Если вы используете только хосты и DNS, вы должны иметь это в /etc/nsswitch.conf
:
hosts: files dns
Причина nslookup desvearth01
работает, потому что nslookup
команда напрямую консультируется /etc/resolv.conf
.Если вы хотите провести лучший тест командной строки, используйте команду:
getent hosts desvearth01
Эти ошибки появляются, когда я изменил имя рабочей станции и попытался запустить Glassfish 2.Вам также необходимо переименовать запись в /etc/hosts, примерно так:
127.0.0.1 localhost
127.0.1.1 MyNewName
На моем экземпляре Amazon у меня возникла та же проблема: проблема с конфигурацией DNS по умолчанию.Итак, чтобы решить проблему, я сделал следующие шаги:
получить имя хоста
$hostname
ip-10-122-16-169
пинговать имя хоста
$ping ip-10-122-16-169
ping: unknown host ip-10-122-16-169
кот /etc/хосты файл, вы получите что-то вроде
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost6 localhost6.localdomain6
теперь вам просто нужно добавить имя хоста в конце первой строки, чтобы при добавлении оно выглядело так
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ip-10-122-16-169
::1 localhost6 localhost6.localdomain6
теперь вы готовы приступить к проверке пинга еще раз с тем же именем хоста
$ping ip-10-122-16-169
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=255 time=0.018 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=255 time=0.024 ms
Проверить /etc/имя хоста затем поместите свое имя хоста в файл хостов.
Если вы видите это сообщение, вам нужно установить имя хоста С hostname superhost.domain
КОМАНДА!
После этого проверьте, какой /etc/hosts
файл содержит такую строку 127.0.0.1 localhost
.
Также проверьте эту команду uname -a
возвращает что-то вроде этого:
Линукс суперхост.домен 2.6.38-8-server #42-Ubuntu SMP Пн, 11 апреля 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
НЕ ТАК!!!!
Линукс (никто) 2.6.38-8-server #42-Ubuntu SMP Пн, 11 апреля 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
Другой вариант представлен в этом посте (на самом деле, то, что находится в вашем файле /etc/sysconfig/network для вашего имени хоста... путем изменения его на полное доменное имя решает эту проблему).
java getLocalHost() UnknownHostException Файл /etc/hosts отличается от Linux API?
У меня тоже есть проблемы по этому поводу.Мне нужно провести дальнейшее тестирование, но похоже, чтоNetworkInterface.getNetworkInterfaces()
может быть надежнее.Я думаю, что это не поиск, а просто захват IP.
Я использую его как «следующий лучший», когда getLocalHost()
терпит неудачу.