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
если вы видите это сообщение, чем вы должны установить имя С 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()
не удается.