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, о котором я не знаю?

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

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

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

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

Поиск хостов в Solaris /etc/nsswitch.conf поэтому в зависимости от того, что в строке "hosts:" сказано, /etc/hosts, NIS, DNS и / или LDAP.

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

хосты: файлы днс

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

getent hosts desvearth01

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

127.0.0.1       localhost
127.0.1.1       MyNewName

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

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

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

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

Linux superhost.domain 2.6.38-8-сервер #42-Ubuntu SMP Пн 11 апреля 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

НЕ ТАК!!!!

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

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

Я использую его как "следующий лучший", когда getLocalHost() выходит из строя.

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

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

Другие вопросы по тегам