JDK6.0的新特性:获取网络接口的物理特性

本文介绍Java 6.0中java.net包新增特性,包括NetworkInterface类的getHardwareAddress等方法及InterfaceAddress类的使用,展示如何跨平台获取MAC地址等网络属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sun中国技术社区的java api文档是jdk5.0,
发现它的更新速度相当不及时;到现在也没见到jdk6.0  api的中文文档;
呵呵,偶的英语水平不是很好.只好到sun的官方文档下载jdk6.0 文档(英文的);
jdk6.0
jdk5.0的巨大变化,我就不多说了,网上多得的是,baidu一搜就是一大堆.
以前想获取MAC或一此网络的物理特性,一般都要使用jni技术,通过新建一个进程(ipconfig/all 命令),获取进程的数据流,从中再取得Mac地址.不过新的jdk6.0已经可以跨平台获得这些特性了.
这里主要介绍在java.net包中的一些新增加的特性.
分别打开jdk5.0jdk6.0的文档,会发现新增了一个类为java.net.InterfaceAddress,
而在类NetworkInterface中也新加了一些函数:
1.“public byte[] getHardwareAddress()”
:以一个字节数组形式返回这个网络接口的硬件地址;
2.“public int getMTU()”
:返回这个网络接口的最大传输单位(MTU)
3.“public List<InterfaceAddress> getInterfaceAddresses()”
:返回一个java.util.List,它包含这个网络接口的所有接口地址
4.“public NetworkInterface getParent()”
:如果这个网络接口是一个子接口,则返回这个网络接口的父网络接口
.............
以下是我得用这两个类做的测试,提取本机的网络接口信息;:
package cat.net;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import static java.lang.System.*;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Iterator;
import java.util.List;
/**
 *
 * @author cattong
 */
public class NetInterfaceDemo {
  
   /** Creates a new instance of NetInterfaceDemo */
   public NetInterfaceDemo() {
   }
   /*
    *
转化成ip地址;
    */
   public static String changeToIP(byte b[]){
      String ip=null;
      if(b.length==4)
         ip=b[0]+"."+b[1]+"."+b[2]+"."+b[3];
      return ip;
   }
   /*
    *
转化成十六进制;
    */
   public static String changeToMAC(byte b[]){
      String mac=null;
      Byte bt=null;
      if(b.length==6){
         mac="";
         String temp="";
         int length=0;
         for(int i=0;i<6;i++){
            int n=b[i];
            temp=Integer.toHexString(n);
            length=temp.length();
            if(length==1){
               mac=mac+"0"+temp+"-";
            }else{
               //out.println(length);
               mac=mac+Integer.toHexString(n).substring(length-2,length)+"-";
            }
         }
      }
      return mac;
   }
   public static void main(String[] args) throws SocketException, UnknownHostException {
      NetworkInterface myInterface=NetworkInterface.getByInetAddress(InetAddress.getLocalHost());
      out.println("
硬件地址:"+changeToMAC(myInterface.getHardwareAddress()));
      out.println("
网络接口的所有接口地址:");
      List<InterfaceAddress> list=myInterface.getInterfaceAddresses();
      Iterator<InterfaceAddress> iter=list.iterator();
     
      InetAddress inet=null;
      InterfaceAddress inf=null;
      while(iter.hasNext()){
         inf=iter.next();
         inet=inf.getAddress();
         out.print("  "+changeToIP(inet.getAddress())+" "+inet.getAddress().length);
         inet=inf.getBroadcast();
         out.println("
广播地址:"+changeToIP(inet.getAddress()));
      }
      out.println("
最大的传输单元:"+myInterface.getMTU());
      String parent=myInterface.getParent()==null?"
":"";
      out.println("
是否存在一个父接口:"+parent);
      String son=myInterface.getSubInterfaces()==null?"
":"";
      out.println("
是否存在一个子接口:"+son);
      out.println("
网络接口是否是一个loopback接口:"+myInterface.isLoopback());
      out.println("
网络接口是否是一个端到端的接口:"+myInterface.isPointToPoint());
      out.println("
如果这个网络接口是'up'并且已经'running':"+myInterface.isUp());
      out.println("
网络接口是否是一个虚拟接口:"+myInterface.isVirtual());
      out.println("
网络接口是否支持多点传送:"+myInterface.supportsMulticast());
   }
}
结果>>>>>>>>>>>>>:
硬件地址:00-14-85-1b-e9-8b-
网络接口的所有接口地址:
  10.5.125.31 4
广播地址:10.5.127.-1
  10.5.124.31 4
广播地址:10.5.124.-1
最大的传输单元:1500
是否存在一个父接口:
是否存在一个子接口:
网络接口是否是一个loopback接口:false
网络接口是否是一个端到端的接口:false
如果这个网络接口是'up'并且已经'running':true
网络接口是否是一个虚拟接口:false
网络接口是否支持多点传送:true
生成成功(总时间:2 秒)
-----------------------------------------------
不过还是有点不太明白,就是广播地址最后一位是数应当是1才对,而不是-1.
以上程序在netbeas上测试过,具体的api可以参考jdk6.0.
如果是window系统可以对测试数据是否正确运行cmd----->输入:ipconfig/all+回车
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跟着猫哥学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值