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
Марк Лейквуд

12
127.0.0.1 localhost <hostname>Мені було достатньо налаштувань
Маріус Сутьє,

Знайшов це занадто пізно. Замість цього закодовано рішення NetworkInterface.getNetworkInterfaces ().
ctpenrose

4
Щоб отримати ім'я хосту, ви можете використовувати hostnameкоманду з терміналу.
Сірий

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 до імені хоста

$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

4

Пошук хостів на Solaris використовує /etc/nsswitch.confце залежно від того, що в рядку 'hosts:' вказується, чи визначається /etc/hosts, чи слід звертатися до NIS, DNS та / або LDAP.

Якщо ви використовуєте лише хости та DNS, ви повинні мати це в /etc/nsswitch.conf:

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

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

getent hosts desvearth01

4

Ця помилка з'являється, коли я змінив назву робочої станції та спробував запустити Glassfish 2. Ви також повинні перейменувати запис у / etc / hosts, приблизно так:

127.0.0.1       localhost
127.0.1.1       MyNewName


1

Якщо ви бачите це повідомлення, то вам потрібно встановити ім'я хосту 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 (немає) 2.6.38-8-сервер # 42-Ubuntu SMP пн квітня 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.