InetAddress.getLocalHost () zgłasza UnknownHostException

87

Testuję naszą aplikację serwerową (napisaną w Javie) na różnych systemach operacyjnych i pomyślałem, że OpenSolaris (2008.11) będzie najmniej kłopotliwy ze względu na ładną integrację z Javą. Okazuje się, że się myliłem, ponieważ otrzymałem UnknownHostException

try {
  computerName = InetAddress.getLocalHost().getHostName();
  if (computerName.indexOf(".") > -1)
    computerName = computerName.substring(0,
        computerName.indexOf(".")).toUpperCase();
} catch (UnknownHostException e) {
  e.printStackTrace();
}

Wynik to:

java.net.UnknownHostException: desvearth01: desvearth01
    at java.net.InetAddress.getLocalHost(InetAddress.java:1353)

Jednak nslookup desvearth01zwraca poprawny adres IP i nslookup localhostzwraca 127.0.0.1zgodnie z oczekiwaniami. Ponadto ten sam kod działa doskonale we FreeBSD. Czy jest coś specjalnego w OpenSolaris, czego nie jestem świadomy?

Doceniam wszelkie wskazówki, dzięki.

jhwist
źródło

Odpowiedzi:

119

W dobrej tradycji mogę jeszcze raz odpowiedzieć na swoje pytanie:

Wygląda na to, że InetAddress.getLocalHost()ignoruje /etc/resolv.conf, ale patrzy tylko na /etc/hostsplik (gdzie nie określiłem niczego poza tym localhost). Dodanie adresu IP i nazwy hosta do tego pliku rozwiązuje problem i wyjątek zniknął.


Inna odpowiedź jest prawie poprawna i otrzymałem wskazówkę z góry i mój problem został rozwiązany ... Dzięki.

Ale aby to poprawić, dodam zmiany krok po kroku, tak aby było to pomocne nawet dla naiwnych użytkowników.

Kroki:

  • Otwórz /etc/hosts, wpisy mogą wyglądać jak poniżej.

     127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  
     ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
  • Musisz dodać jeszcze jedną linię powyżej tego dowolnego edytora, takiego jak vilub gedit(np <your-machine-ip> <your-machine-name> localhost.).

     192.168.1.73 my_foo localhost
    

Teraz ogólny plik może wyglądać tak:

192.168.1.73 my_foo localhost
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
  • Po prostu zapisz go i uruchom ponownie swój kod Java ... Twoja praca jest skończona.
jhwist
źródło
1
Jeśli napotkasz problemy z uprawnieniami podczas próby zapisu do pliku hosts, pomocne będą
poniższe
3
Istnieje również błąd w OS X i java 7, szczegóły i obejście tutaj groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo
Mark Lakewood
12
Ustawienie 127.0.0.1 localhost <hostname>mi wystarczało
Marius Soutier
Znalazłem to za późno. Zamiast tego zakodowałem rozwiązanie NetworkInterface.getNetworkInterfaces ().
ctpenrose
4
Aby uzyskać nazwę hosta, możesz użyć hostnamepolecenia z terminala.
Gray
8

Używam NetworkInterface.getNetworkInterfaces()jako odwrotu, gdy InetAddress.getLocalHost()rzuca UnknownHostException. Oto kod (bez obsługi wyjątków dla przejrzystości).

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();
  }
}

Inne odpowiedzi edytują /etc/hostsplik. Jest to podatne na błędy, kruche, może wymagać dostępu do roota i nie będzie działać na wszystkich systemach operacyjnych.

Nathan
źródło
5

Na mojej instancji amazon miałem ten sam problem, był problem z domyślną konfiguracją DNS. Aby rozwiązać problem, wykonałem następujące kroki -

uzyskać nazwę swojego hosta

$hostname
ip-10-122-16-169

ping do nazwy hosta

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

cat / etc / hosts , otrzymasz coś takiego

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost6 localhost6.localdomain6

teraz wystarczy dodać nazwę hosta na końcu pierwszej linii, więc po dodaniu będzie wyglądać tak

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 ip-10-122-16-169
::1         localhost6 localhost6.localdomain6

teraz jesteś gotowy, aby ponownie sprawdzić ping pod tą samą nazwą hosta

$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
ankit.vishen
źródło
4

Wyszukiwanie hostów w Solarisie używa /etc/nsswitch.confwięc w zależności od tego, co w wierszu „hosts:” mówi, że określa /etc/hosts, czy należy skonsultować się z NIS, DNS i / lub LDAP.

Jeśli używasz tylko hostów i DNS, powinieneś mieć to w /etc/nsswitch.conf:

hosty: pliki dns

Powód nslookup desvearth01działa, ponieważ nslookuppolecenie bezpośrednio konsultuje się /etc/resolv.conf. Jeśli chcesz zrobić lepszy test wiersza poleceń, użyj polecenia:

getent hosts desvearth01
Jaskółka oknówka
źródło
4

Ten błąd pojawia się, gdy zmieniłem nazwę stacji roboczej i próbowałem uruchomić Glassfish 2. Musisz także zmienić nazwę wpisu w / etc / hosts, na przykład:

127.0.0.1       localhost
127.0.1.1       MyNewName
Jimmy
źródło
2

Zamówienie / etc / hostname następnie umieścić swoją nazwę hosta do pliku hosts.

user4877680
źródło
1

Jeśli widzisz ten komunikat, ustaw nazwę hosta ZA POMOCĄ hostname superhost.domain POLECENIA !

Następnie sprawdź, który /etc/hostsplik zawiera taki ciąg 127.0.0.1 localhost.

Sprawdź także, czy polecenie uname -azwraca coś takiego:

Linux superhost.domain 2.6.38-8-server # 42-Ubuntu SMP Pon 11 kwietnia 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux

NIE TAK JAK TO!!!!

Linux (brak) 2.6.38-8-server # 42-Ubuntu SMP pon 11 kwietnia 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux

Pavel
źródło
0

Mam też problemy z tym związane. Muszę przeprowadzić dalsze testy, ale wygląda na to, że NetworkInterface.getNetworkInterfaces()mogą być bardziej wiarygodne. Myślę, że to nie wyszukuje, ale po prostu pobiera adres IP.

Używam go jako „następnego najlepszego”, gdy getLocalHost()zawodzi.

Jon
źródło