java InetAddress.getLocalHost (); renvoie 127.0.0.1… comment obtenir une adresse IP réelle?

J’écris une application de réseau simple … J’ai besoin de connaître la véritable adresse IP de ma machine sur le réseau, comme 192.168.1.3. getLocalHost renvoie 127.0.0.1 (sous Linux, dunno si c’est la même chose sous Windows) comment faire ?;

Si vous voulez réellement travailler avec toutes les adresses IP sur la machine, vous pouvez les obtenir avec la classe NetworkInterface. Bien sûr, vous devez choisir celui que vous souhaitez utiliser, mais cela dépendra de l’utilisation que vous en faites, ou vous devrez peut-être élargir votre utilisation pour prendre en compte plusieurs adresses.

import java.net.*; import java.util.*; public class ShowInterfaces { public static void main(Ssortingng[] args) throws Exception { System.out.println("Host addr: " + InetAddress.getLocalHost().getHostAddress()); // often returns "127.0.0.1" Enumeration n = NetworkInterface.getNetworkInterfaces(); for (; n.hasMoreElements();) { NetworkInterface e = n.nextElement(); System.out.println("Interface: " + e.getName()); Enumeration a = e.getInetAddresses(); for (; a.hasMoreElements();) { InetAddress addr = a.nextElement(); System.out.println(" " + addr.getHostAddress()); } } } } 

Comme la machine peut avoir plusieurs adresses, il est difficile de déterminer celle qui vous convient le mieux. Normalement, vous voulez que le système atsortingbue une adresse IP basée sur sa table de routage. Comme le résultat dépend de l’adresse IP à laquelle vous souhaitez vous connecter, il existe un truc simple: créez simplement une connexion et voyez quelle adresse vous avez depuis le système d’exploitation:

 // output on my machine: "192.168.1.102" Socket s = new Socket("192.168.1.1", 80); System.out.println(s.getLocalAddress().getHostAddress()); s.close(); // output on my machine: "127.0.1.1" System.out.println(InetAddress.getLocalHost().getHostAddress()); 

Je ne suis pas sûr s’il est possible de le faire sans établir une connexion cependant. Je pense avoir déjà réussi à le faire avec Perl (ou C?), Mais ne me posez pas de questions sur Java. Je pense qu’il serait possible de créer un socket UDP (DatagramSocket) sans le connecter réellement.

S’il y a un routeur NAT sur le chemin, vous ne pourrez pas obtenir l’adresse IP que les hôtes distants verront. Cependant, comme vous l’avez indiqué 192. *, je pense que vous vous en fichez.

Réparer:

  1. Trouvez votre nom d’hôte. Type: hostname . Par exemple, vous trouvez que votre nom d’hôte est mycomputer.xzy.com

  2. Placez votre nom d’hôte dans votre fichier hosts. /etc/hosts . Tel que

     10.50.16.136 mycomputer.xzy.com 

Voici un moyen d’éviter les résultats IPv6 et Loopback.

 public InetAddress getCurrentIp() { try { Enumeration networkInterfaces = NetworkInterface .getNetworkInterfaces(); while (networkInterfaces.hasMoreElements()) { NetworkInterface ni = (NetworkInterface) networkInterfaces .nextElement(); Enumeration nias = ni.getInetAddresses(); while(nias.hasMoreElements()) { InetAddress ia= (InetAddress) nias.nextElement(); if (!ia.isLinkLocalAddress() && !ia.isLoopbackAddress() && ia instanceof Inet4Address) { return ia; } } } } catch (SocketException e) { LOG.error("unable to get current IP " + e.getMessage(), e); } return null; } 

Votre ordinateur peut avoir plusieurs adresses IP. Comment savez-vous lequel? La façon dont je le fais est d’avoir un CGI très simple exécuté sur une autre machine qui rend compte de l’IP vue, et je frappe quand j’ai besoin de savoir à quoi ressemble mon IP au monde extérieur.

Au lieu d’utiliser InetAddress.getHostAddress (), j’appelle la routine getHost4Address que j’ai écrite pour obtenir la première adresse non bouclée …

 /** * Returns this host's non-loopback IPv4 addresses. * * @return * @throws SocketException */ private static List getInet4Addresses() throws SocketException { List ret = new ArrayList(); Enumeration nets = NetworkInterface.getNetworkInterfaces(); for (NetworkInterface netint : Collections.list(nets)) { Enumeration inetAddresses = netint.getInetAddresses(); for (InetAddress inetAddress : Collections.list(inetAddresses)) { if (inetAddress instanceof Inet4Address && !inetAddress.isLoopbackAddress()) { ret.add((Inet4Address)inetAddress); } } } return ret; } /** * Returns this host's first non-loopback IPv4 address ssortingng in textual * representation. * * @return * @throws SocketException */ private static Ssortingng getHost4Address() throws SocketException { List inet4 = getInet4Addresses(); return !inet4.isEmpty() ? inet4.get(0).getHostAddress() : null; } 

J’ai écrit ce code:

 import java.net.InterfaceAddress; import java.net.NetworkInterface; import java.util.Collections; import java.util.HashSet; import java.util.Set; private Ssortingng[] getHostAddresses() { Set HostAddresses = new HashSet<>(); try { for (NetworkInterface ni : Collections.list(NetworkInterface.getNetworkInterfaces())) { if (!ni.isLoopback() && ni.isUp() && ni.getHardwareAddress() != null) { for (InterfaceAddress ia : ni.getInterfaceAddresses()) { if (ia.getBroadcast() != null) { //If limited to IPV4 HostAddresses.add(ia.getAddress().getHostAddress()); } } } } } catch (SocketException e) { } return HostAddresses.toArray(new String[0]); } 

Vérifie ça!

Pour moi:

  • Ne doit pas être LoopBack!
  • Doit être UP!
  • Doit avoir une adresse MAC (n’est pas nulle)

Récupère la requête actuelle de l’instance actuelle

 HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 

puis obtenir l’adresse de la demande

 ip = httpServletRequest.getRemoteAddr(); 

Si vous voulez obtenir l’adresse IP de votre PC, vous devez utiliser l’object “InetAddress”, qui existe dans la bibliothèque “java.net.InetAddress”.

La méthode suivante renvoie votre adresse IP:

 public Ssortingng getIp() { Ssortingng myIp = ""; InetAddress ip; try { ip = InetAddress.getLocalHost(); myIp = ip.getHostAddress(); // This method returns the IP. } catch (UnknownHostException e) { e.printStackTrace(); } return myIp; }