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 ?