web-dev-qa-db-fra.com

java InetAddress.getLocalHost (); renvoie 127.0.0.1 ... comment obtenir une VRAIE IP?

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

51
gotch4

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 alors choisir celui que vous souhaitez réellement utiliser, mais cela va être différent selon l'utilisation que vous en faites, ou vous devrez peut-être étendre la façon dont vous l'utilisez pour prendre en compte plusieurs adresses.

import Java.net.*;
import Java.util.*;

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

Comme la machine peut avoir plusieurs adresses, il est difficile de déterminer celle qui vous convient. Normalement, vous souhaitez que le système attribue une IP en fonction de sa table de routage. Comme le résultat dépend de l'adresse IP à laquelle vous souhaitez vous connecter, il existe une astuce simple: créez simplement une connexion et voyez quelle adresse vous avez du 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 sais pas s'il est possible de le faire sans établir de connexion. Je pense que j'ai réussi à le faire avec Perl (ou C?), Mais ne me posez pas de questions sur Java. Je pense qu'il pourrait être possible de créer un socket UDP (DatagramSocket) sans le connecter réellement.

S'il y a un NAT routeur sur le chemin, vous ne pourrez pas obtenir l'adresse IP que les hôtes distants verront cependant. Cependant, comme vous l'avez donné 192. * à titre d'exemple, je pense que vous s'en fout.

21
sfussenegger

Réparer:

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

  2. Mettez votre nom d'hôte dans votre fichier d'hôtes. /etc/hosts. Tel que

    10.50.16.136 mycomputer.xzy.com
    
18
boom boom

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

public InetAddress getCurrentIp() {
            try {
                Enumeration<NetworkInterface> networkInterfaces = NetworkInterface
                        .getNetworkInterfaces();
                while (networkInterfaces.hasMoreElements()) {
                    NetworkInterface ni = (NetworkInterface) networkInterfaces
                            .nextElement();
                    Enumeration<InetAddress> 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;
        }
11
boly38

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 fonctionnant sur une autre machine qui rapporte l'IP qu'il a vu, et je l'ai frappé quand j'ai besoin de savoir à quoi ressemble mon IP pour le monde extérieur.

3
Paul Tomblin

Au lieu d'utiliser InetAddress.getHostAddress (), j'appelle la routine getHost4Address que j'ai écrite pour obtenir la première adresse sans boucle ...

/**
 * Returns this Host's non-loopback IPv4 addresses.
 * 
 * @return
 * @throws SocketException 
 */
private static List<Inet4Address> getInet4Addresses() throws SocketException {
    List<Inet4Address> ret = new ArrayList<Inet4Address>();

    Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
    for (NetworkInterface netint : Collections.list(nets)) {
        Enumeration<InetAddress> 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 string in textual
 * representation.
 * 
 * @return
 * @throws SocketException
 */
private static String getHost4Address() throws SocketException {
    List<Inet4Address> inet4 = getInet4Addresses();
    return !inet4.isEmpty()
            ? inet4.get(0).getHostAddress()
            : null;
}
2
Ken Lin

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 String[] getHostAddresses() {
  Set<String> 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:

  • Ça ne doit pas être LoopBack!
  • Doit être UP!
  • Doit avoir une adresse MAC (n'est pas nulle)
2
chepe lucho

Obtenez l'adresse IP de la boîte actuelle correspondant à un modèle:

import Java.io.*; 
import Java.util.*; 
import Java.util.regex.Pattern; 

String ipPattern = "(192.1.200.)(\\d){1,3}";      //your organization pattern 
try{ 
    Enumeration en = NetworkInterface.getNetworkInterfaces(); 
    while (en.hasMoreElements()) { 
        NetworkInterface ni = (NetworkInterface) en.nextElement(); 
        Enumeration ee = ni.getInetAddresses(); 
        while (ee.hasMoreElements()) { 
            InetAddress ia = (InetAddress) ee.nextElement(); 
            String ip = ia.getHostAddress(); 
            System.out.println("ip: '" + ip + "'\n"); 
            boolean matched = Pattern.matches(ipPattern, ip); 
            if (matched) { 
                System.out.println("matched\n"); 
            }
        } 
    } 
} 
catch(Exception e){ } 

Résultat:

ip: 'fe80:0:0:0:510a:528b:7204:39d0%enp0s25'
ip: '192.1.200.3'
matched
ip: '0:0:0:0:0:0:0:1%lo'
ip: '127.0.0.1'
1

Récupère la demande actuelle de l'instance actuelle

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

puis obtenez l'adresse de la demande

ip = httpServletRequest.getRemoteAddr();
1
Eleven