8
votes

Comment obtenir l'IP LAN d'un client à l'aide de Java?

Comment puis-je obtenir l'adresse IP LAN d'un ordinateur à l'aide de Java? Je souhaite l'adresse IP qui est connectée au routeur et le reste du réseau.

J'ai essayé quelque chose comme ceci: xxx

Ceci semble fonctionner sur certains cas, mais parfois, il renvoie l'adresse de bouclage ou quelque chose de complètement différent. En outre, il nécessite une connexion Internet.

Est-ce que quelqu'un a-t-il une méthode plus précise de faire cela?

EDIT: Il serait préférable de demander ici que Dans un commentaire ..

Et si vous obtenez de nombreuses interfaces? Par exemple, un pour câble, un pour wifi et un pour la boîte virtuelle ou ainsi. Est-il impossible de voir lequel est connecté au réseau?


0 commentaires

5 Réponses :


7
votes

Au début: il n'y a pas d'adresse unique. Votre machine a au moins deux adresses (127.0.0.1 sur "LO" et peut-être 192.168.1.1 sur "Eth1").

Vous voulez ceci: interfaces réseau p>

Vous pouvez pas détecter automatiquement lequel est connecté à l'un de vos routeurs , comme cela nécessite une analyse potentiellement complexe de vos tables de routage. Mais si vous voulez juste une adresse non locale, cela devrait être considéré. Pour être sûr, essayez d'utiliser cela au moins une fois sur Vista ou Windows 7, puisqu'ils ajoutent des adresses IPv6. P>

Display name: bge0
Name: bge0
InetAddress: /fe80:0:0:0:203:baff:fef2:e99d%2
InetAddress: /121.153.225.59

Display name: lo0
Name: lo0
InetAddress: /0:0:0:0:0:0:0:1%1
InetAddress: /127.0.0.1


0 commentaires

16
votes

essayer java.net.networkinterface xxx


3 commentaires

Et si vous avez beaucoup d'interfaces? Par exemple, un pour câble, un pour wifi et un pour la boîte virtuelle ou ainsi. Est-il impossible de voir accueillir avec laquelle on est connecté au réseau?


@Henrik. Dans ce cas, tous sont connectés . Il appartient à votre système d'exploitation de déterminer lequel sera utilisé pour un routage externe. Vous pouvez utiliser ce constructeur de socket java.sun.com/j2se/1.5.0/docs/aplia/java/net/... pour ramasser une adresse locale spécifique et portez ou construisez la prise par défaut et liez-la à une interface spécifique. Vérifiez également que vous pouvez déterminer des informations dont vous avez besoin depuis NetworkInterface Object.


@Henrik. En outre, étant donné que Java doit répondre à tous les OSES, vous pouvez écrire une petite coque sous-échantillon pour déterminer quelle interface locale est une interface de routage et transmettez ces informations à votre programme Java, il peut donc ensuite se lier à ce spécifique. interface. D'autre part, lorsque vous connectez une prise, ce travail est effectué pour vous, alors je vous suggère que vous ne devriez le faire que si vous avez des exigences très spécifiques. De vous poster, il n'est pas clair que ces exigences sont.



0
votes
try {
    InetAddress addr = InetAddress.getLocalHost();

    // Get IP Address
    byte[] ipAddr = addr.getAddress();

    // Get hostname
    String hostname = addr.getHostName();
} catch (UnknownHostException e) {
}

1 commentaires

Ce retour "127.0.0.1" sur de nombreuses machines, donc pas une réponse valide.



1
votes

Ceci est une méthode que j'ai utilisée pendant un moment. Il comprend un petit hack pour comprendre également l'adresse IP visible de l'extérieur.

private List<String> getLocalHostAddresses() {

    List<String> addresses = new ArrayList<String>();

    try {
        Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();

        while (e.hasMoreElements()) {
            NetworkInterface ni = e.nextElement();
            Enumeration<InetAddress> e2 = ni.getInetAddresses();
            while (e2.hasMoreElements())
                addresses.add(e2.nextElement().getHostAddress());
        }
        URL u = new URL("http://whatismyip.org");
        BufferedReader in = new BufferedReader(new InputStreamReader(
                u.openStream()));
        addresses.add(in.readLine());
        in.close();
    } catch (Exception ignore) {
    }

    return addresses;
}


0 commentaires

0
votes

Comme Daniel a déjà signalé, vous ne pouvez pas savoir quelle interface est celle "connectée". Et, par exemple, l'ordinateur dispose de plusieurs cartes d'interface réseau qui sont toutes deux connectées à des ordinateurs de longue durée distincts?

permet à l'utilisateur de décider de l'interface à utiliser ou d'essayer tous, en fonction de votre cas d'utilisation.


0 commentaires