34 votes

Obtenir l'adresse IP locale sans se connecter à l'Internet

Donc, j'essaie 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 ceci :

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 fait des recherches et j'ai trouvé cette réponse https://stackoverflow.com/a/2381398/717341 qui crée simplement un Socket -connexion à une page web (par exemple "google.com") et obtient l'adresse de l'hôte local à partir 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 il doit se connecter à l'internet pour fonctionner. Comme mon application ne nécessite pas de connexion à Internet et que cela pourrait sembler "suspect" que l'application essaie de se connecter à Google à chaque fois qu'elle est lancée, je n'aime pas l'idée de l'utiliser.

Donc, après quelques recherches supplémentaires, je suis tombée sur la 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, le résultat est le suivant :

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'adresse IP souhaitée, mais je ne suis pas sûr de l'autre adresse ( fe80:0:0:0:226:4aff:fe0d:592e%3 ) signifie.

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

Avez-vous d'autres idées que de recourir à RegEx ou à l'internet ?

24voto

yankee Points 6587

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 ne vous intéressez qu'à IPv4, alors laissez tomber le cas d'IPv6. Mais attention, IPv6 est l'avenir ^^.

P.S. : Vérifiez si certaines de vos break aurait dû être continue s.

13voto

tsds Points 1706

Voici également une façon de le faire en 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();
}

8voto

Ehud Lev Points 63
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;
}

5voto

Ashad Shanto Points 1414
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
        }

    }

}

2voto

Russell Zahniser Points 11176

La réponse de Yankee est correcte pour la première partie. Pour imprimer l'adresse IP, vous pouvez l'obtenir sous la forme d'un tableau d'octets et le convertir en représentation normale de chaîne de caractères, 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());

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