InetAddress.getLocalHost() выдает UnknownHostException

Я тестирую наше серверное приложение (написанное на 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 что-то особенное, о чем я не знаю?

Любые подсказки приветствуются, спасибо.


person jhwist    schedule 10.12.2009    source источник


Ответы (9)


По доброй традиции, еще раз могу ответить на свой вопрос:

Кажется, что 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... ваша работа выполнена.
person jhwist    schedule 10.12.2009
comment
Если у вас возникнут проблемы с правами доступа при попытке записи в файл hosts, вам помогут следующие инструкции:decoding.wordpress.com/2009/04/06/ - person septerr; 06.08.2012
comment
Также существует ошибка в OS X и java 7, подробности и обходной путь здесь groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo - person Mark Lakewood; 17.06.2014
comment
Мне хватило настройки 127.0.0.1 localhost <hostname> - person Marius Soutier; 05.09.2014
comment
Нашел это слишком поздно. Вместо этого закодировано решение NetworkInterface.getNetworkInterfaces(). - person ctpenrose; 25.03.2015
comment
Чтобы получить имя хоста, вы можете использовать команду hostname из терминала. - person Gray; 06.11.2015
comment
У меня была аналогичная проблема в SuSE13 с Java8. Добавление хоста и ip в /etc/hosts помогло, но после этого nslookup ‹hostname› больше не работал из-за тайм-аута. Поэтому я удалил «localhost» в конце строки, и теперь nslookup и мое Java-приложение работали правильно. - person Jan Rasehorn; 04.05.2017

Я использую 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())
      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();
  }
}

Другие ответы редактируют файл /etc/hosts. Это подвержено ошибкам, хрупко, может потребовать корневого доступа и не будет работать на всех ОС.

person Nathan    schedule 16.09.2015

В моем экземпляре Amazon у меня была такая же проблема, была проблема с конфигурацией DNS по умолчанию. Итак, чтобы решить проблему, я сделал следующие шаги:

получить имя хоста

$hostname
ip-10-122-16-169

пинг по имени хоста

$ping ip-10-122-16-169
ping: unknown host ip-10-122-16-169

cat /etc/hosts, вы получите что-то вроде

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
person ankit.vishen    schedule 14.06.2017
comment
работал для экземпляра ec2, спасибо - person baybatu; 24.12.2020

Поиск хостов в 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
person Martin    schedule 20.05.2010

Эта ошибка появляется, когда я изменил имя рабочей станции и попытался запустить Glassfish 2. Вы также должны переименовать запись в /etc/hosts примерно так:

127.0.0.1       localhost
127.0.1.1       MyNewName
person Jimmy    schedule 22.09.2015

Оформить заказ /etc/hostname, а затем поместить свое имя хоста в файл hosts.

person user4877680    schedule 08.05.2015

Если вы видите это сообщение, вам нужно установить имя хоста С hostname superhost.domain КОМАНДОЙ!

После этого проверьте, какой /etc/hosts файл содержит строку, подобную этой 127.0.0.1 localhost.

Также убедитесь, что команда uname -a возвращает что-то вроде этого:

Linux superhost.domain 2.6.38-8-server #42-Ubuntu SMP Пн, 11 апр., 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

НЕ ТАК!!!!

Linux (нет) 2.6.38-8-server #42-Ubuntu SMP Пн 11 апр 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

person Pavel    schedule 27.07.2012

Другой вариант описан в этом посте (на самом деле то, что находится в вашем файле /etc/sysconfig/network для вашего имени хоста... путем изменения его на полное доменное имя решает эту проблему).

java getLocalHost() UnknownHostException /etc/hosts отличается от linux API?

person Dean Hiller    schedule 28.08.2012

У меня тоже проблемы с этим. Мне нужно провести дополнительное тестирование, но похоже, что NetworkInterface.getNetworkInterfaces() может быть более надежным. Я думаю, что это не делает поиск, а просто захватывает IP.

Я использую его как «следующий лучший», когда getLocalHost() терпит неудачу.

person Jon    schedule 06.07.2010