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 🙂