为了账号安全,请及时绑定邮箱和手机立即绑定

如何从Java枚举所有已启用的NIC卡的IP地址?

/ 猿问

如何从Java枚举所有已启用的NIC卡的IP地址?

慕粉4167745 2019-11-15 10:52:32

缺少解析输出ipconfig,没有人有100%的纯Java方法吗?



查看完整描述

3 回答

?
暮色呼如

这很简单:


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)");

}


查看完整回答
反对 回复 2019-11-15
?
慕田峪4524236

其中一些仅在JDK 1.6及更高版本中有效(该版本中添加了一种方法。)


List<InetAddress> addrList = new ArrayList<InetAddress>();

for(NetworkInterface ifc : NetworkInterface.getNetworkInterfaces()) {

   if(ifc.isUp()) {

      for(InetAddress addr : ifc.getInetAddresses()) {

        addrList.add(addr);

      }

   }

}

在1.6之前的版本要困难一些-在此之前不支持isUp()。


FWIW:Javadocs注意,这是获取节点的所有IP地址的正确方法:


注意:可以使用getNetworkInterfaces()+ getInetAddresses()获得此节点的所有IP地址


查看完整回答
反对 回复 2019-11-15
?
慕盖茨4494581

由于添加了InterfaceAddress代码,因此该代码仅在Java 1.6中有效。


  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();

  }

“ toMACAddrString”方法如下所示:


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(":");

  }

}

和“ toIPAddrString”方法在这里:


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();

}

在上面的try / catch中,我在名为IPConfig的类中的方法dump()中拥有第一组代码。然后,我只是在IPConfig中放置了一个main方法来调用新的IPConfig()。dump(),这样当我试图找出一些古怪的网络问题时,我可以看到Java认为这种情况还在继续。我发现Fedora框报告的信息不同于Windows的LocalHost信息,这导致Java程序出现问题。


我意识到它与其他答案类似,但是它可以打印出几乎所有您可以从接口和ipaddress api获得的有趣信息。


查看完整回答
反对 回复 2019-11-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信