338 votes

Méthode recommandée pour obtenir le nom d’hôte en Java

Lequel des énoncés suivants est la façon meilleure et plus portable pour obtenir le nom d’hôte de l’ordinateur actuel en Java ?

``

vs

``

406voto

A.H. Points 23369

Strictement parlant, vous n'avez pas le choix, mais appelant hostname(1) ou - sur Unix gethostname(2). C'est le nom de votre ordinateur. Toute tentative visant à déterminer le nom d'hôte par l'adresse IP comme ceci

InetAddress.getLocalHost().getHostName()

est vouée à l'échec dans certaines circonstances:

  • L'adresse IP peut pas résoudre dans n'importe quel nom. Mauvaise configuration de DNS, mauvaise configuration du système ou un mauvais fournisseur de programme d'installation peut être la raison pour cela.
  • Un nom dans le DNS peut avoir plusieurs alias appelé Cname. Ceux-ci ne peuvent être résolus que dans un sens correctement: nom de l'adresse. Le sens inverse est ambigu. Quel est le nom "officiel"?
  • Un hôte peut avoir plusieurs adresses IP différentes et chaque adresse peut avoir plusieurs noms. Deux cas sont les suivants: Un port ethernet a plusieurs "logiques" des adresses IP ou l'ordinateur est équipé de plusieurs ports ethernet. Il est configurable si elles partagent une adresse IP ou ont des IPs différentes. Ceci est appelé "multi-hôtes".
  • Un Nom dans le DNS peut résoudre de plusieurs Adresses IP. Et pas tous de ces adresses doivent être situés sur le même ordinateur! (Cas d'utilisation: Une simple forme d'équilibrage de charge)
  • Nous allons même pas commencer à parler des adresses IP dynamiques.

Aussi, ne pas confondre le nom d'une adresse IP par le nom de l'hôte (hostname). Une métaphore pourrait le rendre plus clair:

Il est d'une grande ville (serveur) dite "de Londres". À l'intérieur des murs de la ville beaucoup d'affaires qui se passe. La ville dispose de plusieurs portes (adresses IP). Chaque porte a un nom ("Porte du Nord", "la Rivière" à la Porte, "Southampton" à la Porte...), mais le nom de la porte n'est pas le nom de la ville. Aussi vous ne pouvez pas déduire le nom de la ville en utilisant le nom d'un porte - "Porte du Nord" serait attraper la moitié des grandes villes, et pas seulement une ville. Toutefois - d'un inconnu (paquet IP) des promenades le long de la rivière et de la demande locale: "j'ai un étrange adresse: 'Rivergate, deuxième à gauche, la troisième maison". Pouvez-vous m'aider?" Le local dit: "bien sûr, vous êtes sur la bonne voie, il suffit d'aller de l'avant et vous arriverez à votre destination à l'intérieur d'une demi-heure."

Cela illustre assez bien je pense.

La bonne nouvelle est que Le vrai nom d'hôte est généralement pas nécessaire. Dans la plupart des cas, tout nom qui se résout en une adresse IP à l'hôte doit faire. (L'étranger peut entrer dans la ville par Northgate, mais utile habitants traduire le "2ème à gauche" partie.)

Si le solde du coin des cas, vous devez utiliser l' définitive de la source de ce paramètre de configuration - qui est la fonction C gethostname(2). Cette fonction est également appelée par le programme d' hostname.

109voto

Nick Knowlson Points 2715

InetAddress.getLocalHost().getHostName() est certainement la meilleure façon de faire.

exec("hostname") fait appel au système d'exploitation pour exécuter l' hostname commande.

Si vous avez besoin de plus de preuves, d'autres DONC les réponses qui sont liées à cette utilisation de l' InetAddress moyen de le faire. [1] [2]

EDIT: Vous devriez jeter un oeil à A. H. réponse pour valoir un avis contraire. Une réponse à cette personne qui est spécifiquement demandé portable, je pense toujours que l' getHostName() est bien, mais A. H. apporte quelques bons points qui devraient être considérés.

27voto

Arnout Engelen Points 2106

InetAddress.getLocalHost().getHostName() est mieux (comme l'a expliqué Nick), mais toujours pas très bien

Un hôte peut être connu sous divers noms d'hôtes. Habituellement, vous allez être à la recherche pour le nom d'hôte de votre hôte est dans un contexte spécifique.

Par exemple, dans une application web, vous pourriez être à la recherche pour le nom d'hôte utilisé par la personne qui a émis la demande que vous êtes en train de manutention. La meilleure façon de trouver que l'un dépend du framework que vous utilisez pour votre application web.

Dans une sorte de autre internet service, vous aurez envie le nom d'hôte de votre service est disponible par le biais de l '"extérieur". En raison de proxy, pare-feu etc cela pourrait même ne pas être un nom d'hôte sur la machine de votre service est installé, vous pouvez venir avec un raisonnable par défaut, mais vous devriez certainement faire de cette configurable pour celui qui l'installe.

11voto

Thomas W Points 7179

Les variables d'environnement peut également fournir un moyen utile -- COMPUTERNAME sur Windows, HOSTNAME sur la plupart des modernes Unix/Linux coquilles.

Voir: http://stackoverflow.com/a/17956000/768795

Je suis en utilisant ces "complémentaire" méthodes d' InetAddress.getLocalHost().getHostName(), étant donné que plusieurs personnes le point, qui ne fonctionne pas dans tous les environnements.

Runtime.getRuntime().exec("hostname") est un autre supplément. À ce stade, je ne l'ai pas utilisé.

// try InetAddress.LocalHost first;
//      NOTE -- InetAddress.getLocalHost().getHostName() will not work in certain environments.
try {
    String result = InetAddress.getLocalHost().getHostName();
    if (StringUtils.isNotEmpty( result))
        return result;
} catch (UnknownHostException e) {
    // failed;  try alternate means.
}

// try environment properties.
//      
String host = System.getenv("COMPUTERNAME");
if (host != null)
    return host;
host = System.getenv("HOSTNAME");
if (host != null)
    return host;

// undetermined.
return null;

5voto

ThuVien247.net Points 31
hostName == null;
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
{
    while (interfaces.hasMoreElements()) {
        NetworkInterface nic = interfaces.nextElement();
        Enumeration<InetAddress> addresses = nic.getInetAddresses();
        while (hostName == null && addresses.hasMoreElements()) {
            InetAddress address = addresses.nextElement();
            if (!address.isLoopbackAddress()) {
                hostName = address.getHostName();
            }
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X