1. 程式人生 > >JDK6.0的新特性:獲取網路介面的物理特性

JDK6.0的新特性:獲取網路介面的物理特性

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+回車