À moins d'analyser la sortie de ipconfig
, est-ce que quelqu'un a une méthode 100% pure Java pour le faire?
C'est assez simple:
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<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
LOG.info(" " + intf.getName() + " " + intf.getDisplayName());
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
LOG.info(" " + enumIpAddr.nextElement().toString());
}
}
} catch (SocketException e) {
LOG.info(" (error retrieving network interface list)");
}
Une partie de cela ne fonctionnera que dans JDK 1.6 et supérieur (une des méthodes a été ajoutée dans cette version.)
List<InetAddress> addrList = new ArrayList<InetAddress>();
for(NetworkInterface ifc : NetworkInterface.getNetworkInterfaces()) {
if(ifc.isUp()) {
for(InetAddress addr : ifc.getInetAddresses()) {
addrList.add(addr);
}
}
}
Avant 1.6, c'est un peu plus difficile - isUp () n'est pas supporté jusque-là.
FWIW: Le Javadocs notez que c'est la bonne approche pour obtenir toutes les adresses IP pour un nœud:
REMARQUE: peut utiliser getNetworkInterfaces () + getInetAddresses () pour obtenir toutes les adresses IP de ce nœud
Ce code ne fonctionne qu'en Java 1.6 en raison du code InterfaceAddress ajouté.
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<NetworkInterface> theIntfList = NetworkInterface.getNetworkInterfaces();
List<InterfaceAddress> 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();
}
La méthode "toMACAddrString" ressemble à ceci:
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(":");
}
}
et la méthode "toIPAddrString" est ici:
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();
}
J'ai ce premier ensemble de code dans le try/catch ci-dessus dans une méthode appelée dump () dans la classe appelée IPConfig. Ensuite, je viens de mettre une méthode principale dans IPConfig pour appeler new IPConfig (). Dump () afin que lorsque j'essaie de comprendre un problème de réseau loufoque, je puisse voir Java pense que ça va Je me suis rendu compte que ma boîte Fedora signale des informations différentes de Windows pour les informations LocalHost et que cela causait des problèmes à mon Java programmes).
Je me rends compte que c'est similaire aux autres réponses, mais il imprime presque tout ce qui est intéressant que vous pouvez obtenir à partir de l'interface et des API ipaddress.
// Get list of IP addresses from all local network interfaces. (JDK1.7)
// -----------------------------------------------------------
public List<InetAddress> getListOfIPsFromNIs(){
List<InetAddress> addrList = new ArrayList<InetAddress>();
Enumeration<NetworkInterface> enumNI = NetworkInterface.getNetworkInterfaces();
while ( enumNI.hasMoreElements() ){
NetworkInterface ifc = enumNI.nextElement();
if( ifc.isUp() ){
Enumeration<InetAddress> enumAdds = ifc.getInetAddresses();
while ( enumAdds.hasMoreElements() ){
InetAddress addr = enumAdds.nextElement();
addrList.add(addr);
System.out.println(addr.getHostAddress()); //<---print IP
}
}
}
return addrList;
}
Comme l'a souligné le commentaire de Sam Skuce:
Cela ne se compile pas dans JDK 1.7. getNetworkInterfaces renvoie une énumération qui n'implémente pas Iterable. - Sam Skuce 11 juillet 12 à 19:58
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<InetAddress> addrList = new ArrayList<InetAddress>();
Enumeration<NetworkInterface> 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<InetAddress> 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());
}
}
}
}
}