InetAddress.getLocalHost () выдает исключение UnknownHostException


87

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

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

Ответы:


119

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

Кажется, что 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-код ... ваша работа сделана.

1
Если вы столкнетесь с проблемами разрешения при попытке записи в файл hosts, инструкции здесь помогут: decoding.wordpress.com/2009/04/06/…
septerr

3
Также есть ошибка в OS X и java 7, подробности и обходное решение здесь groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo
Mark Lakewood

12
Окружение 127.0.0.1 localhost <hostname>было достаточно для меня
Marius Soutier

Обнаружил это слишком поздно. Вместо этого закодировал решение NetworkInterface.getNetworkInterfaces ().
ctpenrose

4
Чтобы получить имя хоста, вы можете использовать hostnameкоманду из терминала.
Gray

8

Я использую 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файл. Это подвержено ошибкам, нестабильно, может потребовать root-доступа и не будет работать на всех ОС.


5

На моем экземпляре 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

4

Поиск хостов в Solaris использует /etc/nsswitch.confтак, в зависимости от того, что написано в строке «hosts:», он определяет /etc/hosts, следует ли обращаться к NIS, DNS и / или LDAP.

Если вы используете только хосты и DNS, вы должны иметь это в /etc/nsswitch.conf:

хосты: файлы dns

Причина nslookup desvearth01работы в том, что nslookupкоманда обращается напрямую /etc/resolv.conf. Если вы хотите улучшить тест командной строки, используйте команду:

хосты getent desvearth01

4

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

127.0.0.1       localhost
127.0.1.1       MyNewName

2

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


1

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

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

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

Linux superhost.domain 2.6.38-8-server # 42-Ubuntu SMP Mon Apr 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux

НЕ ТАК!!!!

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



0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.