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

时间:2022-05-27 14:02:37
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.0 jdk6.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+ 回车