Come enumerare gli indirizzi IP di tutte le tabs NIC abilitate da Java?

A parte l’analisi dell’output di ipconfig , qualcuno ha un modo java puro al 100% per farlo?

Questo è abbastanza facile:

 try { InetAddress localhost = InetAddress.getLocalHost(); LOG.info(" IP Addr: " + localhost.getHostAddress()); // Just in case this host has multiple IP addresses.... InetAddress[] allMyIps = InetAddress.getAllByName(localhost.getCanonicalHostName()); if (allMyIps != null && allMyIps.length > 1) { LOG.info(" Full list of IP addresses:"); for (int i = 0; i < allMyIps.length; i++) { LOG.info(" " + allMyIps[i]); } } } catch (UnknownHostException e) { LOG.info(" (error retrieving server host name)"); } try { LOG.info("Full list of Network Interfaces:"); for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); LOG.info(" " + intf.getName() + " " + intf.getDisplayName()); for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) { LOG.info(" " + enumIpAddr.nextElement().toString()); } } } catch (SocketException e) { LOG.info(" (error retrieving network interface list)"); } 

Alcuni di questi funzioneranno solo in JDK 1.6 e versioni successive (uno dei metodi è stato aggiunto in quella versione).

 List addrList = new ArrayList(); for(NetworkInterface ifc : NetworkInterface.getNetworkInterfaces()) { if(ifc.isUp()) { for(InetAddress addr : ifc.getInetAddresses()) { addrList.add(addr); } } } 

Prima di 1.6, è un po ‘più difficile – isUp () non è supportato fino ad allora.

FWIW: Javadocs nota che questo è l’approccio corretto per ottenere tutti gli indirizzi IP per un nodo:

NOTA: è ansible utilizzare getNetworkInterfaces () + getInetAddresses () per ottenere tutti gli indirizzi IP per questo nodo

Questo codice funziona solo in Java 1.6 a causa del codice InterfaceAddress aggiunto.

  try { System.out.println("Output of Network Interrogation:"); System.out.println("********************************\n"); InetAddress theLocalhost = InetAddress.getLocalHost(); System.out.println(" LOCALHOST INFO"); if(theLocalhost != null) { System.out.println(" host: " + theLocalhost.getHostName()); System.out.println(" class: " + theLocalhost.getClass().getSimpleName()); System.out.println(" ip: " + theLocalhost.getHostAddress()); System.out.println(" chost: " + theLocalhost.getCanonicalHostName()); System.out.println(" byteaddr: " + toMACAddrString(theLocalhost.getAddress())); System.out.println(" sitelocal?: " + theLocalhost.isSiteLocalAddress()); System.out.println(""); } else { System.out.println(" localhost was null"); } Enumeration theIntfList = NetworkInterface.getNetworkInterfaces(); List theAddrList = null; NetworkInterface theIntf = null; InetAddress theAddr = null; while(theIntfList.hasMoreElements()) { theIntf = theIntfList.nextElement(); System.out.println("--------------------"); System.out.println(" " + theIntf.getDisplayName()); System.out.println(" name: " + theIntf.getName()); System.out.println(" mac: " + toMACAddrString(theIntf.getHardwareAddress())); System.out.println(" mtu: " + theIntf.getMTU()); System.out.println(" mcast?: " + theIntf.supportsMulticast()); System.out.println(" loopback?: " + theIntf.isLoopback()); System.out.println(" ptp?: " + theIntf.isPointToPoint()); System.out.println(" virtual?: " + theIntf.isVirtual()); System.out.println(" up?: " + theIntf.isUp()); theAddrList = theIntf.getInterfaceAddresses(); System.out.println(" int addrs: " + theAddrList.size() + " total."); int addrindex = 0; for(InterfaceAddress intAddr : theAddrList) { addrindex++; theAddr = intAddr.getAddress(); System.out.println(" " + addrindex + ")."); System.out.println(" host: " + theAddr.getHostName()); System.out.println(" class: " + theAddr.getClass().getSimpleName()); System.out.println(" ip: " + theAddr.getHostAddress() + "/" + intAddr.getNetworkPrefixLength()); System.out.println(" bcast: " + intAddr.getBroadcast().getHostAddress()); int maskInt = Integer.MIN_VALUE >> (intAddr.getNetworkPrefixLength()-1); System.out.println(" mask: " + toIPAddrString(maskInt)); System.out.println(" chost: " + theAddr.getCanonicalHostName()); System.out.println(" byteaddr: " + toMACAddrString(theAddr.getAddress())); System.out.println(" sitelocal?: " + theAddr.isSiteLocalAddress()); System.out.println(""); } } } catch (SocketException e) { e.printStackTrace(); } catch (UnknownHostException e) { e.printStackTrace(); } 

Il metodo “toMACAddrString” ha il seguente aspetto:

 public static String toMACAddrString(byte[] a) { if (a == null) { return "null"; } int iMax = a.length - 1; if (iMax == -1) { return "[]"; } StringBuilder b = new StringBuilder(); b.append('['); for (int i = 0;; i++) { b.append(String.format("%1$02x", a[i])); if (i == iMax) { return b.append(']').toString(); } b.append(":"); } } 

e il metodo “toIPAddrString” è qui:

 public static String toIPAddrString(int ipa) { StringBuilder b = new StringBuilder(); b.append(Integer.toString(0x000000ff & (ipa >> 24))); b.append("."); b.append(Integer.toString(0x000000ff & (ipa >> 16))); b.append("."); b.append(Integer.toString(0x000000ff & (ipa >> 8))); b.append("."); b.append(Integer.toString(0x000000ff & (ipa))); return b.toString(); } 

Ho quel primo set di codice nel try / catch sopra in un metodo chiamato dump () in class chiamato IPConfig. Quindi ho appena messo un metodo principale in IPConfig per chiamare il nuovo IPConfig (). Dump () in modo che quando sto cercando di capire qualche strano problema di rete, posso vedere che i pensieri di Java stanno succedendo. Ho capito che la mia scatola Fedora riporta informazioni diverse da quelle di Windows per le informazioni LocalHost e stava causando alcuni problemi ai miei programmi Java.

Mi rendo conto che è simile alle altre risposte, ma stampa quasi tutto ciò che è interessante che puoi ottenere dall’interfaccia e dall’apis di ipaddress.

Aggiornamento per correggere la risposta di Jared per JDK 1.7.

 // Get list of IP addresses from all local network interfaces. (JDK1.7) // ----------------------------------------------------------- public List getListOfIPsFromNIs(){ List addrList = new ArrayList(); Enumeration enumNI = NetworkInterface.getNetworkInterfaces(); while ( enumNI.hasMoreElements() ){ NetworkInterface ifc = enumNI.nextElement(); if( ifc.isUp() ){ Enumeration enumAdds = ifc.getInetAddresses(); while ( enumAdds.hasMoreElements() ){ InetAddress addr = enumAdds.nextElement(); addrList.add(addr); System.out.println(addr.getHostAddress()); //<---print IP } } } return addrList; } 

Come evidenziato dal commento di Sam Skuce:

Questo non si compila in JDK 1.7. getNetworkInterfaces restituisce un'enumerazione che non implementa Iterable. - Sam Skuce 11 luglio 12 alle 19:58

Esempio di uscita:

 fe80:0:0:0:800:aaaa:aaaa:0%8 192.168.56.1 fe80:0:0:0:227:aaa:aaaa:6b5%2 123.123.123.123 0:0:0:0:0:0:0:1%1 127.0.0.1 
 import java.net.*; import java.util.*; public class NIC { public static void main(String args[]) throws Exception { List addrList = new ArrayList(); Enumeration interfaces = null; try { interfaces = NetworkInterface.getNetworkInterfaces(); } catch (SocketException e) { e.printStackTrace(); } InetAddress localhost = null; try { localhost = InetAddress.getByName("127.0.0.1"); } catch (UnknownHostException e) { e.printStackTrace(); } while (interfaces.hasMoreElements()) { NetworkInterface ifc = interfaces.nextElement(); Enumeration addressesOfAnInterface = ifc.getInetAddresses(); while (addressesOfAnInterface.hasMoreElements()) { InetAddress address = addressesOfAnInterface.nextElement(); if (!address.equals(localhost) && !address.toString().contains(":")) { addrList.add(address); System.out.println("FOUND ADDRESS ON NIC: " + address.getHostAddress()); } } } } }