InetAddress.getLocalHost () genera UnknownHostException


87

Sto testando la nostra applicazione server (scritta Java) su diversi sistemi operativi e ho pensato che OpenSolaris (2008.11) sarebbe stato il meno problematico a causa della bella integrazione con Java. Si scopre che mi sbagliavo, dato che finisco con un'eccezione UnknownHostException

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

L'output è:

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

Tuttavia, nslookup desvearth01restituisce l'indirizzo IP corretto e nslookup localhostrestituisce 127.0.0.1come previsto. Inoltre, lo stesso codice funziona perfettamente su FreeBSD. C'è qualcosa di speciale in OpenSolaris di cui non sono a conoscenza?

Eventuali suggerimenti apprezzati, grazie.

Risposte:


119

Nella buona tradizione, posso rispondere ancora una volta alla mia domanda:

Sembra che InetAddress.getLocalHost()ignori il /etc/resolv.conf, ma guarda solo il /etc/hostsfile (dove non avevo specificato altro localhost). L'aggiunta dell'IP e del nome host a questo file risolve il problema e l'eccezione è sparita.


Un'altra risposta è quasi corretta e ho ricevuto un suggerimento dall'alto e il mio problema è stato risolto ... Grazie.

Ma per migliorare questo, aggiungo modifiche passo passo, in modo che sia utile anche per gli utenti ingenui.

Passaggi:

  • Apri /etc/hosts, le voci potrebbero apparire come di seguito.

     127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  
     ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
  • È necessario aggiungere un'altra riga sopra di questa da qualsiasi editor come vio gedit(ad esempio <your-machine-ip> <your-machine-name> localhost).

     192.168.1.73 my_foo localhost
    

Ora, il file complessivo potrebbe essere simile a questo:

192.168.1.73 my_foo localhost
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
  • Basta salvarlo ed eseguire di nuovo il codice Java ... il tuo lavoro è fatto.

1
Se riscontri problemi di autorizzazione quando provi a scrivere nel file hosts, le istruzioni qui ti aiuteranno: decoding.wordpress.com/2009/04/06/…
septerr

3
C'è anche un bug in OS X e java 7, dettagli e soluzione alternativa qui groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo
Mark Lakewood

12
L'impostazione 127.0.0.1 localhost <hostname>era sufficiente per me
Marius Soutier,

L'ho trovato troppo tardi. Codificato invece una soluzione NetworkInterface.getNetworkInterfaces ().
ctpenrose

4
Per ottenere il tuo nome host, puoi utilizzare il hostnamecomando dal terminale.
Grigio

8

Uso NetworkInterface.getNetworkInterfaces()come ripiego per quando InetAddress.getLocalHost()lancia un UnknownHostException. Ecco il codice (senza la gestione delle eccezioni per chiarezza).

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

Altre risposte modificano il /etc/hostsfile. Questo è soggetto a errori, fragile, potrebbe richiedere l'accesso come root e non funzionerà su tutti i sistemi operativi.


5

Sulla mia istanza Amazon stavo avendo lo stesso problema, c'era un problema di configurazione DNS predefinito. Quindi, per risolvere il problema, avevo eseguito questi passaggi:

ottieni il tuo nome host

$hostname
ip-10-122-16-169

ping al nome host

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

cat / etc / hosts , otterrai qualcosa di simile

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

ora devi solo aggiungere il tuo nome host alla fine della prima riga, quindi quando lo aggiungi apparirà come

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

ora sei pronto per andare, per controllare nuovamente il ping dello stesso hostname

$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

4

Le ricerche host su Solaris utilizzano /etc/nsswitch.confquindi, a seconda di ciò che dice la riga "hosts:", determina se è /etc/hostsnecessario consultare NIS, DNS e / o LDAP.

Se usi solo host e DNS dovresti avere questo in /etc/nsswitch.conf:

host: file dns

Il motivo nslookup desvearth01funziona è perché il nslookupcomando consulta direttamente /etc/resolv.conf. Se vuoi eseguire un test della riga di comando migliore, usa il comando:

getent hosts desvearth01

4

Questo errore si presenta quando ho cambiato il nome della workstation e ho provato ad avviare Glassfish 2. Devi anche rinominare la voce in / etc / hosts, qualcosa del genere:

127.0.0.1       localhost
127.0.1.1       MyNewName

2

Controlla / etc / hostname quindi metti il ​​tuo hostname nel file hosts.


1

Se vedi questo messaggio allora devi impostare l'hostname WITH hostname superhost.domain COMMAND !

Successivamente, controlla quale /etc/hostsfile contiene una stringa come questa 127.0.0.1 localhost.

Inoltre, controlla che il comando uname -arestituisca qualcosa del genere:

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

NON COSÌ!!!!

Linux (nessuno) 2.6.38-8-server # 42-Ubuntu SMP lun 11 apr 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux



0

Sto avendo problemi anche su questo. Devo fare ulteriori test, ma sembra che NetworkInterface.getNetworkInterfaces()possa essere più affidabile. Penso che questo non esegua la ricerca, ma acquisisca solo l'IP.

Lo sto usando come il "prossimo migliore" quando getLocalHost()fallisce.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.