web-dev-qa-db-fra.com

Obtenez une adresse IP locale sans vous connecter à Internet

J'essaie donc d'obtenir l'adresse IP de ma machine dans mon réseau local (qui devrait être 192.168.178.41).

Ma première intention était d'utiliser quelque chose comme ça:

InetAddress.getLocalHost().getHostAddress();

mais il ne renvoie que 127.0.0.1, ce qui est correct mais pas très utile pour moi.

J'ai cherché et trouvé cette réponse https://stackoverflow.com/a/2381398/717341 , ce qui crée simplement une connexion Socket- à une page Web (par exemple "google. com ") et obtient l'adresse hôte locale du socket:

Socket s = new Socket("google.com", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();

Cela fonctionne pour ma machine (elle renvoie 192.168.178.41), Mais elle doit se connecter à Internet pour fonctionner. Étant donné que mon application ne nécessite pas de connexion Internet et qu'il peut sembler "suspect" que l'application essaie de se connecter à Google à chaque lancement, je n'aime pas l'idée de l'utiliser.

Donc, après quelques recherches supplémentaires, je suis tombé sur la classe NetworkInterface-, qui (avec un peu de travail) renvoie également l'adresse IP souhaitée:

Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()){
    NetworkInterface current = interfaces.nextElement();
    System.out.println(current);
    if (!current.isUp() || current.isLoopback() || current.isVirtual()) continue;
    Enumeration<InetAddress> addresses = current.getInetAddresses();
    while (addresses.hasMoreElements()){
        InetAddress current_addr = addresses.nextElement();
        if (current_addr.isLoopbackAddress()) continue;
        System.out.println(current_addr.getHostAddress());
    }
}

Sur ma machine, cela renvoie les éléments suivants:

name:eth1 (eth1)
fe80:0:0:0:226:4aff:fe0d:592e%3
192.168.178.41
name:lo (lo)

Il trouve mes deux interfaces réseau et renvoie l'IP souhaitée, mais je ne sais pas ce que signifie l'autre adresse (fe80:0:0:0:226:4aff:fe0d:592e%3).

De plus, je n'ai pas trouvé de moyen de le filtrer à partir des adresses retournées (en utilisant les méthodes isXX()- de l'objet InetAddress-) autrement qu'en utilisant RegEx, que je trouve très " sale".

Avez-vous d'autres idées que d'utiliser RegEx ou Internet?

34
Lukas Knuth

fe80: 0: 0: 0: 226: 4aff: fe0d: 592e est votre adresse ipv6 ;-).

Vérifiez cela en utilisant

if (current_addr instanceof Inet4Address)
  System.out.println(current_addr.getHostAddress());
else if (current_addr instanceof Inet6Address)
  System.out.println(current_addr.getHostAddress());

Si vous vous souciez simplement d'IPv4, jetez simplement le boîtier IPv6. Mais attention, IPv6 est le futur ^^.

P.S .: Vérifiez si certains de vos breaks auraient dû être continues.

24
yankee

Voici également une façon de le faire Java 8:

public static String getIp() throws SocketException {

    return Collections.list(NetworkInterface.getNetworkInterfaces()).stream()
            .flatMap(i -> Collections.list(i.getInetAddresses()).stream())
            .filter(ip -> ip instanceof Inet4Address && ip.isSiteLocalAddress())
            .findFirst().orElseThrow(RuntimeException::new)
            .getHostAddress();
}
13
tsds
public static String getIp(){
    String ipAddress = null;
    Enumeration<NetworkInterface> net = null;
    try {
        net = NetworkInterface.getNetworkInterfaces();
    } catch (SocketException e) {
        throw new RuntimeException(e);
    }

    while(net.hasMoreElements()){
        NetworkInterface element = net.nextElement();
        Enumeration<InetAddress> addresses = element.getInetAddresses();
        while (addresses.hasMoreElements()){
            InetAddress ip = addresses.nextElement();
            if (ip instanceof Inet4Address){

                if (ip.isSiteLocalAddress()){

                    ipAddress = ip.getHostAddress();
                }

            }

        }
    }
    return ipAddress;
}
8
Ehud Lev
import Java.net.*;

public class Get_IP
{
    public static void main(String args[])
    {
        try
        {
            InetAddress addr = InetAddress.getLocalHost();
            String hostname = addr.getHostName();
            System.out.println(addr.getHostAddress());
            System.out.println(hostname);
        }catch(UnknownHostException e)
        {
             //throw Exception
        }


    }

}

5
Ashad Shanto

La réponse de Yankee est correcte pour la première partie. Pour imprimer l'adresse IP, vous pouvez l'obtenir sous forme de tableau d'octets et la convertir en représentation de chaîne normale comme ceci:

StringBuilder ip = new StringBuilder();
for(byte b : current_addr.getAddress()) {
    // The & here makes b convert like an unsigned byte - so, 255 instead of -1.
    ip.append(b & 0xFF).append('.');
}
ip.setLength(ip.length() - 1); // To remove the last '.'
System.out.println(ip.toString());
2
Russell Zahniser