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.
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
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());
}
}
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
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
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
Checkout / etc/hostname puis mettez votre nom d’hôte dans le fichier hosts.
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
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.
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?