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...код вашей работы выполняемый.

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

если вы используете только hosts и 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

Я использую 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 для узла

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

кошки /и т. д./хосты файл, вы получите что-то вроде

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 затем поместите имя хоста в файл hosts.


если вы видите это сообщение, чем вы должны установить имя С hostname superhost.domain команда!

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

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

Linux superhost.домен 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


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

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


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

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