Вопрос

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

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

Это было полезно?

Решение

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

Кажется, что 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());
  }
}

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

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

127.0.0.1       localhost
127.0.1.1       MyNewName

На моем экземпляре Amazon у меня возникла та же проблема: проблема с конфигурацией DNS по умолчанию.Итак, чтобы решить проблему, я сделал следующие шаги:

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

$hostname
ip-10-122-16-169

пинговать имя хоста

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

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

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 superhost.domain КОМАНДА!

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

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

Линукс суперхост.домен 2.6.38-8-server #42-Ubuntu SMP Пн, 11 апреля 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

НЕ ТАК!!!!

Линукс (никто) 2.6.38-8-server #42-Ubuntu SMP Пн, 11 апреля 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top