InetAddress.getLocalHost () throws Unknown
-
18-09-2019 - |
Frage
Ich teste unsere Server-Anwendung (geschrieben Java) auf verschiedenen Betriebssystemen und dachte, dass Opensolaris (2008.11) würde die am wenigsten störend sein, wegen der schönen Java-Integration. Es stellte sich heraus, dass ich falsch war, als ich mit einem Unknown am Ende
try {
computerName = InetAddress.getLocalHost().getHostName();
if (computerName.indexOf(".") > -1)
computerName = computerName.substring(0,
computerName.indexOf(".")).toUpperCase();
} catch (UnknownHostException e) {
e.printStackTrace();
}
Die Ausgabe lautet:
java.net.UnknownHostException: desvearth01: desvearth01
at java.net.InetAddress.getLocalHost(InetAddress.java:1353)
Allerdings nslookup desvearth01
gibt die korrekte IP-Adresse und nslookup localhost
kehrt 127.0.0.1
wie erwartet. Auch der gleiche Code funktioniert perfekt auf FreeBSD. Gibt es etwas Besonderes zu Opensolaris, die ich bin mir nicht bewusst?
Für Hinweise dankbar, danke.
Lösung
In guter Tradition kann ich meine eigene Frage noch einmal beantworten:
Es scheint, dass InetAddress.getLocalHost()
ignoriert die /etc/resolv.conf sieht aber nur in der / etc / hosts-Datei (wo ich nichts außer localhost angegeben hatte). Hinzufügen von IP und Hostnamen in dieser Datei löst das Problem und die Ausnahme ist weg.
über Antwort fast richtig ist, und ich habe Hauch von oben und mein Problem gelöst bekommen ... Danke.
Aber um dies zu verbessern, ich bin Hinzufügen von Schritten-by-Schritten verändert, so dass es selbst für naiven Anwender hilfreich sein wird.
Schritte:
-
Öffnen / etc / hosts, die Einträge wie folgt aussehen könnten.
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
-
Sie müssen über diesen von einem beliebigen Editor wie vi oder gedit eine weitere Zeile hinzuzufügen.
<your-machine-ip> <your-machine-name> localhost
zB.192.168.1.73 my_foo localhost
Nun Gesamtdatei kann wie folgt aussehen:
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 wiederholen Sie Ihre Java ... Code Ihre Arbeit getan ist.
Andere Tipps
Ich verwende NetworkInterface.getNetworkInterfaces()
als Fallback für, wenn InetAddress.getLocalHost()
wirft ein UnknownHostException
. Hier ist der Code (ohne Ausnahme für Klarheit Handhabung).
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());
}
}
Host-Lookups auf Solaris verwendet /etc/nsswitch.conf
so je nachdem, was die 'hosts:'. Zeile sagt sie bestimmt, ob /etc/hosts
, NIS, DNS und / oder LDAP sollte konsultiert werden
Wenn Sie nur Hosts und DNS verwenden, sollten Sie diese in /etc/nsswitch.conf
haben:
hosts: files dns
Der Grund nslookup desvearth01
funktioniert, weil der nslookup
Befehl /etc/resolv.conf
direkt konsultiert. Wenn Sie eine bessere Befehlszeile Test machen wollen, verwenden Sie den Befehl:
getent hosts desvearth01
Dieser Fehler erscheint, wenn ich den Workstation-Namen geändert und versuchte Start Glassfish 2. Sie müssen auch den Eintrag umbenennen in / etc / hosts, so etwas wie folgt aus:
127.0.0.1 localhost
127.0.1.1 MyNewName
Auf meinem amazon Beispiel war ich das gleiche Problem haben, war es Standard-DNS-Konfigurationsproblem. So zu beheben, um das Problem, das ich diese Schritte getan hatte -
erhalten Sie Ihre Hostnamen
$hostname
ip-10-122-16-169
ping Hostname
$ping ip-10-122-16-169
ping: unknown host ip-10-122-16-169
Katze / etc / hosts Datei, werden Sie so etwas wie
erhalten
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost6 localhost6.localdomain6
Jetzt brauchen Sie nur Ihren Hostnamen am Ende der ersten Zeile anzuhängen, so dass, wenn Sie anhängen wird es aussehen
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ip-10-122-16-169
::1 localhost6 localhost6.localdomain6
jetzt bist du bereit zu gehen, ping wieder die gleichen Hostnamen zu überprüfen
$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
Zur Kasse / etc / hostname dann auf Hosts-Datei setzen Sie Ihren Hostnamen.
Wenn Sie diese Meldung als Sie eingestellt Hostnamen müssen mit hostname superhost.domain
COMMAND !
Danach prüft die Datei /etc/hosts
enthalten Zeichenfolge wie diese 127.0.0.1 localhost
.
Überprüfen Sie auch, dass Befehl uname -a
etwas wie folgt zurückgibt:
Linux superhost.domain 2.6.38-8-Server # 42-Ubuntu SMP Mo 11. April 03.49.04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux
Nicht so !!!!
Linux (keine) 2.6.38-8-Server # 42-Ubuntu SMP Mo 11. April 03.49.04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux
Eine weitere Möglichkeit ist in diesem Beitrag (in der Tat, was in ist / etc / sysconfig / network-Datei für Ihre Hostnamen ..., indem sie es zu einem FQDN Namen behebt dieses Problem zu ändern).
java getLocalHost () Unknown / etc / hosts-Datei unterscheidet sich linux api?
Ich habe Probleme, um dies auch. Ich brauche weitere Tests zu tun, aber es sieht aus wie
NetworkInterface.getNetworkInterfaces()
kann zuverlässiger sein. Ich denke, dass dies nicht die Lookup tut, sondern greift nur die IP.
Ich benutze es als ‚zweitbeste Lösung‘, wenn der getLocalHost()
ausfällt.