InetAddress.getLocalHost() выбрасывает UnknownHostException

Я тестирую наше серверное приложение (написанное Java) на разных операционных системах и полагаю, что OpenSolaris (2008.11) будет наименее проблематичным из-за хорошей интеграции Java. Оказывается, я ошибался, так как в итоге я получил неизвестное исключение

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

Любые подсказки оценены, спасибо.

Ответ 1

В доброй традиции я снова могу ответить на свой вопрос:

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

Ответ 2

Поиск хоста в 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

Ответ 3

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

127.0.0.1       localhost
127.0.1.1       MyNewName

Ответ 4

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

Ответ 5

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

Ответ 6

В моем экземпляре amazon у меня была такая же проблема, была проблема с настройкой DNS по умолчанию. Поэтому, чтобы исправить проблему, я сделал эти шаги -

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

$hostname
ip-10-122-16-169

ping для имени хоста

$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 снова одно и то же имя хоста

$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

Ответ 7

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

После этого проверьте, какой файл /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 (none) 2.6.38-8-server # 42-Ubuntu SMP Mon Apr 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

Ответ 8

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

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