InetAddress.getLocalHost () arroja UnknownHostException

87

Estoy probando nuestra aplicación de servidor (Java escrito) en diferentes sistemas operativos y pensé que OpenSolaris (2008.11) sería el menos problemático debido a la buena integración de Java. Resulta que estaba equivocado, ya que termino con una UnknownHostException

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

La salida es:

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

Sin embargo, nslookup desvearth01devuelve la dirección IP correcta y nslookup localhostvuelve 127.0.0.1como se esperaba. Además, el mismo código funciona perfectamente en FreeBSD. ¿Hay algo especial en OpenSolaris que yo no sepa?

Cualquier sugerencia apreciada, gracias.

jhwist
fuente

Respuestas:

119

En buena tradición, puedo responder a mi propia pregunta una vez más:

Parece que InetAddress.getLocalHost()ignora el /etc/resolv.conf, pero solo mira el /etc/hostsarchivo (donde no había especificado nada además localhost). Agregar la IP y el nombre de host a este archivo resuelve el problema y la excepción desaparece.


Otra respuesta es casi correcta y recibí una pista de arriba y mi problema se resolvió ... Gracias.

Pero para mejorar esto, estoy agregando cambios paso a paso, de modo que sea útil incluso para usuarios ingenuos.

Pasos:

  • Abierto /etc/hosts, las entradas pueden verse como a continuación.

     127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  
     ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
  • Debe agregar una línea más arriba de esto por cualquier editor como vio gedit(por ejemplo <your-machine-ip> <your-machine-name> localhost).

     192.168.1.73 my_foo localhost
    

Ahora, el archivo general puede verse así:

192.168.1.73 my_foo localhost
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
  • Simplemente guárdelo y vuelva a ejecutar su código Java ... su trabajo está hecho.
jhwist
fuente
1
Si se encuentra con problemas de permisos al intentar escribir en el archivo de hosts, instrucciones aquí ayudarán: decoding.wordpress.com/2009/04/06/...
septerr
3
También hay un error en OS X y java 7, detalles y solución aquí groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo
Mark Lakewood
12
El entorno 127.0.0.1 localhost <hostname>fue suficiente para mí
Marius Soutier
Encontré esto demasiado tarde. En su lugar, codificó una solución NetworkInterface.getNetworkInterfaces ().
ctpenrose
4
Para obtener su nombre de host, puede usar el hostnamecomando de la terminal.
Grey
8

Lo uso NetworkInterface.getNetworkInterfaces()como respaldo para cuando InetAddress.getLocalHost()lanza un UnknownHostException. Aquí está el código (sin manejo de excepciones para mayor claridad).

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

Otras respuestas editan el /etc/hostsarchivo. Esto es propenso a errores, frágil, puede requerir acceso de root y no funcionará en todos los sistemas operativos.

Nathan
fuente
5

En mi instancia de Amazon, tenía el mismo problema, había un problema de configuración de DNS predeterminado. Entonces, para solucionar el problema, hice estos pasos:

consigue tu nombre de host

$hostname
ip-10-122-16-169

ping al nombre de host

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

cat / etc / hosts , obtendrá algo como

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

ahora solo necesita agregar su nombre de host al final de la primera línea, por lo que cuando lo agregue se verá como

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

ahora está listo para comenzar, para verificar el ping nuevamente con el mismo nombre de host

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

Las búsquedas de host en Solaris lo usan, /etc/nsswitch.confdependiendo de lo que dice la línea 'hosts:', determina si se /etc/hostsdebe consultar NIS, DNS y / o LDAP.

Si solo usa hosts y DNS, debe tener esto en /etc/nsswitch.conf:

hosts: archivos dns

La razón nslookup desvearth01funciona es porque el nslookupcomando consulta directamente/etc/resolv.conf . Si desea hacer una mejor prueba de línea de comandos, use el comando:

getent hosts desvearth01
Martín
fuente
4

Este error aparece cuando cambié el nombre de la estación de trabajo e intenté iniciar Glassfish 2. También debe cambiar el nombre de la entrada en / etc / hosts, algo como esto:

127.0.0.1       localhost
127.0.1.1       MyNewName
Palanqueta
fuente
2

Verifique / etc / hostname y luego coloque su nombre de host en el archivo hosts.

usuario4877680
fuente
1

Si ve este mensaje, entonces necesita establecer el nombre de host CON hostname superhost.domain COMMAND !

Después de esto, verifique qué /etc/hostsarchivo contiene una cadena como esta 127.0.0.1 localhost.

Además, verifique que el comando uname -adevuelva algo como esto:

Linux superhost.domain 2.6.38-8-servidor # 42-Ubuntu SMP Lun Abr 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux

¡¡¡¡ASÍ NO!!!!

Linux (ninguno) 2.6.38-8-server # 42-Ubuntu SMP Lunes 11 de abril 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux

Pavel
fuente
0

También estoy teniendo problemas con esto. Necesito hacer más pruebas, pero parece que NetworkInterface.getNetworkInterfaces()puede ser más confiable. Creo que esto no hace la búsqueda, solo toma la IP.

Lo estoy usando como el 'siguiente mejor' cuando getLocalHost()falla.

Jon
fuente