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... код ваша работа сделана.
Я использую 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 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 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
Поиск хостов в Solaris /etc/nsswitch.conf
поэтому в зависимости от того, что в строке "hosts:" сказано, /etc/hosts
, NIS, DNS и / или LDAP.
Если вы используете только хосты и DNS, вы должны иметь это в /etc/nsswitch.conf
:
хосты: файлы днс
Причина nslookup desvearth01
работает потому, что nslookup
команда напрямую консультируется /etc/resolv.conf
, Если вы хотите сделать лучший тест командной строки, используйте команду:
getent hosts desvearth01
Эта ошибка появляется, когда я изменил имя рабочей станции и попытался запустить Glassfish 2. Вы также должны переименовать запись в /etc/hosts, примерно так:
127.0.0.1 localhost
127.0.1.1 MyNewName
Извлеките /etc/hostname, затем поместите ваше имя хоста в файл hosts.
Если вы видите это сообщение, то вам нужно установить имя хоста WITH hostname superhost.domain
КОМАНДА!
После этого проверьте, какие /etc/hosts
файл содержит такую строку 127.0.0.1 localhost
,
Также проверьте эту команду uname -a
возвращает что-то вроде этого:
Linux superhost.domain 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
У меня также есть проблемы вокруг этого. Мне нужно сделать дальнейшее тестирование, но похоже,NetworkInterface.getNetworkInterfaces()
может быть более надежным. Я думаю, что это не делает поиск, а просто захватывает IP.
Я использую его как "следующий лучший", когда getLocalHost()
выходит из строя.
Другой вариант в этом посте (на самом деле, то, что находится в вашем файле /etc/sysconfig/network для вашего имени хоста... путем изменения его на полное доменное имя, решает эту проблему).
java getLocalHost () UnknownHostException Файл /etc/hosts отличается от linux api?