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()
терпит неудачу.
Ответ 9
Еще одна опция в этом сообщении (на самом деле, то, что находится в вашем/etc/sysconfig/сетевом файле для вашего имени хоста... путем изменения его имени FQDN, устраняет эту проблему).
java getLocalHost() Файл UnknownHostException/etc/hosts отличается linux api?