用java得到w2k计算机上的网卡物理地址 阅读次数13543

--------------------------------------------------------------------------------
网卡物理地址在全球是唯一不重复的,所以有时我们需要得到一个计算机的网卡物理地址来确认用户身份,下面我编写了一个GetPhysicalAddress类来获得当前计算机的网卡物理地址,此方法只能获取win2k系统的网卡物理地址
,不能用于其他操作系统。

众所周知,在win2k下的shell环境里,我们可以使用ipconfig/all命令查看当前网卡配置情况,其中有一项是网卡的物理地址。例如在DOS环境中输入 ipconfig/all命令,结果如下:

 

    

Host Name . . . . . . . . . . . . : mars
        Primary DNS Suffix  . . . . . . . :
        Node Type . . . . . . . . . . . . : Hybrid
        IP Routing Enabled. . . . . . . . : No
        WINS Proxy Enabled. . . . . . . . : No
        DNS Suffix Search List. . . . . . : worksoft.com.cnPPP adapter 263:
        Connection-specific DNS Suffix  . :
        Description . . . . . . . . . . . : WAN (PPP/SLIP) I
        Physical Address. . . . . . . . . : 00-53-45-00-00-0
        DHCP Enabled. . . . . . . . . . . : No
        IP Address. . . . . . . . . . . . : 61.135.2.27
        Subnet Mask . . . . . . . . . . . : 255.255.255.255
        Default Gateway . . . . . . . . . : 61.135.2.27
        DNS Servers . . . . . . . . . . . : 202.106.196.152
                                            202.106.196.115

 

加粗部分是网卡的物理地址

我们只要在java中执行这个外部命令,然后把需要的字符串解析出来就可以得到当前机器的物理网卡地址了。
首先编写一个Util_syscmd类,方法execute()使我们能够执行外部命令,并返回一个Vector类型的结果集。

 

import java.lang.*;
import java.io.*;
import java.util.*;/**
 * @author Jackliu
 *  
 */
public class Util_syscmd{ /**
  * @param shellCommand
  *  
  */
 public Vector execute(String shellCommand){
  try{
   Start(shellCommand);
   Vector vResult=new Vector();
   DataInputStream in=new DataInputStream(p.getInputStream());
   BufferedReader reader=new BufferedReader(new InputStreamReader(in));
   String line;
   do{
    line=reader.readLine();
    if (line==null){
     break;
    }
    else{
     vResult.addElement(line);
    }
   }while(true);
   reader.close();
   return vResult;  }catch(Exception e){
   //error
   return null;
  }
 }
 /**
  * @param shellCommand
  *  
  */
 public void Start(String shellCommand){
  try{
   if(p!=null){
    kill();
   }
   Runtime sys= Runtime.getRuntime();
   p=sys.exec(shellCommand);
  }catch(Exception e){
   System.out.println(e.toString());
  }
 }
 /**
  kill this process
 */
 public void kill(){
  if(p!=null){
   p.destroy();
   p=null;
  }
 }
 
 Process p;
}

 

然后设计一个GetPhysicalAddress类,这个类用来调用Util_syscmd类的execute()方法,执行cmd.exe/c ipconfig/all命令,并解析出网卡物理ip地址。getPhysicalAddress()方法返回网卡的物理地址,如果机器中没有安装网卡或操作系统不支持ipconfig命令,返回not find字符串

import java.io.*;
import java.util.*;class GetPhysicalAddress{
        //网卡物理地址长度
        static private final int _physicalLength =16;
        
        public static void main(String[] args){               
                //output you computer phycail ip address
                System.out.println(getPhysicalAddress());
        }
        
        static public String getPhysicalAddress(){
                Util_syscmd shell =new Util_syscmd();
                String cmd = "cmd.exe /c ipconfig/all";
                Vector result ;
                result=shell.execute(cmd);  
                return parseCmd(result.toString());      
        }
        
        //从字符串中解析出所需要获得的字符串
        static private String parseCmd(String s){
                String find="Physical Address. . . . . . . . . :";
                int findIndex=s.indexOf(find);
                if (findIndex==-1)
                        return "not find";
                else
                        return s.substring(findIndex+find.length()+1,findIndex+find.length()+1+_physicalLength);
                
                
        }
}