web-dev-qa-db-fra.com

InetAddress.getLocalHost () lève une exception UnknownHostException

Je teste notre application serveur (écrite en Java) sur différents systèmes d'exploitation et je pense qu'OpenSolaris (2008.11) serait le moins gênant en raison de l'intégration de Nice Java. Il s'avère que j'avais tort, car Je me retrouve avec une UnknownHostException

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

La sortie est:

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

Toutefois, nslookup desvearth01 renvoie l’adresse IP correcte et nslookup localhost résultats 127.0.0.1 comme prévu. En outre, le même code fonctionne parfaitement sur FreeBSD. Y a-t-il quelque chose de spécial à OpenSolaris dont je ne suis pas au courant?

Toute allusion appréciée, merci.

79
jhwist

Dans la tradition, je peux répondre une nouvelle fois à ma propre question:

Il semble que InetAddress.getLocalHost() ignore le fichier /etc/resolv.conf mais ne regarde que le fichier/etc/hosts (où je n'avais rien spécifié d'autre que localhost). L'ajout de l'adresse IP et du nom d'hôte à ce fichier résout le problème et l'exception a disparu.


La réponse ci-dessus est presque correcte et j'ai eu un soupçon d'en haut et mon problème a été résolu ... Merci.

Mais pour améliorer cela, j’ajoute des changements étape par étape, de sorte qu’il sera utile aux utilisateurs même naïfs.

Pas:

  • Ouvrez/etc/hosts, les entrées peuvent ressembler à celles ci-dessous.

    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
  • vous devez ajouter une ligne supplémentaire au-dessus de ceci par n'importe quel éditeur comme vi ou gedit. <your-machine-ip> <your-machine-name> localhost par exemple.

    192.168.1.73 my_foo localhost
    

Maintenant, le fichier global peut ressembler à ceci:

192.168.1.73 my_foo localhost
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
  • Sauvegardez-le et lancez à nouveau votre code Java ... votre travail est terminé.
113
jhwist

J'utilise NetworkInterface.getNetworkInterfaces() comme solution de rechange lorsque InetAddress.getLocalHost() jette un UnknownHostException =. Voici le code (sans exception pour plus de clarté).

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

Les recherches d’hôte sur Solaris utilisent /etc/nsswitch.conf donc, selon ce que dit la ligne 'hosts:', elle détermine si /etc/hosts, NIS, DNS et/ou LDAP doivent être consultés.

Si vous utilisez uniquement des hôtes et DNS, vous devriez avoir ceci en /etc/nsswitch.conf:

hôtes: fichiers DNS

La raison nslookup desvearth01 fonctionne parce que la commande nslookup consulte directement /etc/resolv.conf. Si vous souhaitez effectuer un meilleur test en ligne de commande, utilisez la commande suivante:

hôtes getent desvearth01
4
Martin

Cette erreur apparaît lorsque j'ai changé le nom du poste de travail et essayé de démarrer Glassfish 2. Vous devez également renommer l'entrée située dans/etc/hosts, à peu près comme ceci:

127.0.0.1       localhost
127.0.1.1       MyNewName
4
Jimmy

Sur mon instance Amazon j'avais le même problème, il y avait un problème de configuration DNS par défaut. Donc, pour résoudre le problème, j'avais fait ces étapes -

obtenez votre nom d'hôte

$hostname
ip-10-122-16-169

ping au nom d'hôte

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

cat / etc/hosts fichier, vous obtiendrez quelque chose comme

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

maintenant, il vous suffit d’ajouter votre nom d’hôte à la fin de la première ligne.

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

maintenant vous êtes prêt à partir, pour vérifier à nouveau ping le même nom d'hôte

$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
ankit.vishen

Checkout / etc/hostname puis mettez votre nom d’hôte dans le fichier hosts.

2
user4877680

Si vous voyez ce message, vous devez définir le nom d'hôte AVEC hostname superhost.domain COMMANDE !

Après cela, vérifiez quel /etc/hosts Le fichier contient une chaîne comme celle-ci 127.0.0.1 localhost.

Vérifiez également cette commande uname -a retourne quelque chose comme ceci:

Linux superhôte.domaine 2.6.38-8-server # 42-Ubuntu SMP Lundi 11 avril 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

pas comme ça !!!!

Linux (aucun) 2.6.38-8-server # 42-Ubuntu SMP Lundi 11 avril 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

1
Pavel

J'ai des problèmes à ce sujet aussi. J'ai besoin de faire d'autres tests, mais il semble que NetworkInterface.getNetworkInterfaces() puisse être plus fiable. Je pense que cela ne fait pas la recherche, mais saisit simplement l'adresse IP.

Je l'utilise comme "meilleur résultat suivant" lorsque la getLocalHost() échoue.

0
Jon

Une autre option est dans ce post (en fait, ce qui est dans votre fichier/etc/sysconfig/network pour votre nom d’hôte ... en le changeant en un nom de domaine complet résout ce problème).

Le fichier Java getLocalHost () UnknownHostException/diff/lin diffère de l'API linux?

0
Dean Hiller