Da das Ermitteln der lokalen IPs über alle Interface angeblich Voodoo ist, hier mal eine Lösung ohne Voodoo 🙂
import java.net.InetAddress; import java.net.NetworkInterface; try { Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces(); while (networkInterfaces.hasMoreElements()) { NetworkInterface networkInterface = (NetworkInterface)networkInterfaces.nextElement(); Enumeration ips = networkInterface.getInetAddresses(); while ( ips.hasMoreElements() ) { // InetAddress ipa = (InetAddress)ips.nextElement(); String ip = ((InetAddress)ips.nextElement()).toString(); ip = ip.replaceAll("/", "").replaceAll("%.*$",""); ... HIER mit der IP was machen ... } } } catch (Exception e) { e.printStackTrace(); }
Eine kleine Anmerkung dazu. Das ist ja der Cast auf InetAddress, es werden an der Stelle aber IPv4 und IPv6 Objekte zurück gegeben, die sich eben ohne Cast-Fehlermeldung nur als InetAddress verarbeiten lassen. Wenn Ihr wissen wollt, was es ist, ohne eine RegEx über das Ergebnis zu legen, lest einfach die Klasse des Objekts aus:
InetAddress ipa = (InetAddress)ips.nextElement(); log( ipa.getClass().getName() ); String ip = ipa.toString().replaceAll("/", "").replaceAll("%.*$","");
Anstatt getName() kann man auch getSimpleName() oder getType() benutzen, ganz wie es Euch gefällt.
Alternative:
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces(); while (networkInterfaces.hasMoreElements()) { NetworkInterface networkInterface = (NetworkInterface)networkInterfaces.nextElement(); for (InterfaceAddress address : networkInterface.getInterfaceAddresses()) { String ip = address.getAddress().toString(); int netmask = address.getNetworkPrefixLength(); log( netmask + ip ); ip = ip.replaceAll("/", "").replaceAll("%.*$",""); } }
Da bekommt man auch gleich die Netzwerkmaske mit, ist wohl der bessere Weg 🙂