InetAddress.getLocalHost () löst eine UnknownHostException aus

87

Ich teste unsere Serveranwendung (geschriebenes Java) auf verschiedenen Betriebssystemen und dachte, dass OpenSolaris (2008.11) aufgrund der netten Java-Integration am wenigsten problematisch wäre. Es stellte sich heraus, dass ich falsch lag, da ich am Ende eine UnknownHostException hatte

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

Die Ausgabe ist:

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

Jedoch, nslookup desvearth01 gibt die korrekte IP - Adresse, und nslookup localhostkehrt 127.0.0.1wie erwartet. Der gleiche Code funktioniert auch perfekt unter FreeBSD. Gibt es etwas Besonderes an OpenSolaris, das mir nicht bekannt ist?

Alle Hinweise geschätzt, danke.

jhwist
quelle

Antworten:

119

In guter Tradition kann ich meine eigene Frage noch einmal beantworten:

Es scheint, dass das InetAddress.getLocalHost()ignoriert /etc/resolv.conf, aber nur die /etc/hostsDatei betrachtet (wo ich nichts anderes angegeben hatte localhost). Das Hinzufügen der IP und des Hostnamens zu dieser Datei löst das Problem und die Ausnahme ist verschwunden.


Eine andere Antwort ist fast richtig und ich habe einen Hinweis von oben bekommen und mein Problem wurde gelöst ... Danke.

Um dies zu verbessern, füge ich schrittweise Änderungen hinzu, damit dies auch für naive Benutzer hilfreich ist.

Schritte:

  • Öffnen Sie /etc/hosts, die Einträge könnten wie folgt aussehen.

     127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  
     ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
  • Sie müssen eine weitere Zeile darüber von einem beliebigen Editor wie vioder gedit(z <your-machine-ip> <your-machine-name> localhost. B. ) hinzufügen .

     192.168.1.73 my_foo localhost

Die Gesamtdatei sieht nun folgendermaßen aus:

192.168.1.73 my_foo localhost
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
  • Speichern Sie es einfach und führen Sie Ihren Java-Code erneut aus ... Ihre Arbeit ist erledigt.
jhwist
quelle
1
Wenn beim Versuch, in die Hosts-Datei zu schreiben, Berechtigungsprobleme auftreten, helfen die Anweisungen hier: decoding.wordpress.com/2009/04/06/…
September
3
Es gibt auch einen Fehler in OS X und Java 7, Details und Problemumgehung
Mark Lakewood
12
Einstellung 127.0.0.1 localhost <hostname>war für mich ausreichend
Marius Soutier
Fand das zu spät. Codierte stattdessen eine NetworkInterface.getNetworkInterfaces () -Lösung.
Ctpenrose
4
Um Ihren Hostnamen zu erhalten, können Sie den hostnameBefehl vom Terminal aus verwenden.
Grau
8

Ich benutze NetworkInterface.getNetworkInterfaces()als Rückfall für wenn InetAddress.getLocalHost()wirft ein UnknownHostException. Hier ist der Code (aus Gründen der Übersichtlichkeit ohne Ausnahmebehandlung).

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

Andere Antworten bearbeiten die /etc/hostsDatei. Dies ist fehleranfällig, spröde, erfordert möglicherweise Root-Zugriff und funktioniert nicht auf allen Betriebssystemen.

Nathan
quelle
5

Auf meiner Amazon-Instanz hatte ich das gleiche Problem, es gab ein Standardproblem bei der DNS-Konfiguration. Um das Problem zu beheben, hatte ich diese Schritte ausgeführt -

Holen Sie sich Ihren Hostnamen

$hostname
ip-10-122-16-169

Ping an Hostname

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

cat / etc / hosts Datei, erhalten Sie so etwas wie

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

Jetzt müssen Sie nur noch Ihren Hostnamen am Ende der ersten Zeile anhängen. Wenn Sie ihn also anhängen, sieht er so aus

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

Jetzt können Sie loslegen und den gleichen Hostnamen erneut pingen

$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
quelle
4

Host-Lookups unter Solaris werden /etc/nsswitch.confalso abhängig davon verwendet , was in der Zeile "hosts:" angegeben ist, ob bestimmt wird, ob/etc/hosts NIS, DNS und / oder LDAP konsultiert werden sollen.

Wenn Sie nur Hosts und DNS verwenden, sollten Sie dies in haben /etc/nsswitch.conf :

Hosts: Dateien DNS

Der Grund dafür nslookup desvearth01ist, dass der nslookupBefehl direkt konsultiert /etc/resolv.conf. Wenn Sie einen besseren Befehlszeilentest durchführen möchten, verwenden Sie den folgenden Befehl:

getent Hosts desvearth01
Martin
quelle
4

Dieser Fehler wird angezeigt, wenn ich den Namen der Arbeitsstation geändert und versucht habe, Glassfish 2 zu starten. Sie müssen den Eintrag auch in / etc / hosts umbenennen.

127.0.0.1       localhost
127.0.1.1       MyNewName
Jimmy
quelle
2

Kasse / etc / hostname und füge deinen Hostnamen in die Hosts-Datei ein.

user4877680
quelle
1

Wenn Sie diese Meldung sehen, müssen Sie den Hostnamen WITH hostname superhost.domain COMMAND festlegen !

Überprüfen Sie anschließend, welche /etc/hostsDatei eine solche Zeichenfolge enthält 127.0.0.1 localhost.

Überprüfen Sie außerdem, ob der Befehl uname -aFolgendes zurückgibt:

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

SO NICHT!!!!

Linux (keine) 2.6.38-8-Server # 42-Ubuntu SMP Mo Apr 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux

Pavel
quelle
0

Ich habe auch Probleme damit. Ich muss weitere Tests durchführen, aber es sieht so aus NetworkInterface.getNetworkInterfaces() es zuverlässiger sein kann. Ich denke, dass dies nicht die Suche macht, sondern nur die IP erfasst.

Ich benutze es als das "nächstbeste", wenn das getLocalHost()fehlschlägt.

Jon
quelle