<%@ page contentType="text/html; charset=gb2312"%> 用纯JAVA语言编程读取MAC地址的实现
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
用纯JAVA语言编程读取MAC地址的实现
     发布者: 发布时间:2007-07-26

  本文介绍如何在WindowXP/NT/2000环境中,编写纯Java程序,执行外部命令IPCONFIG,并通过分析该命令的输入流而获得本机的MAC地址的编程方法。

  1 引言

  用Java编写的程序,可以很方便地运行在各种平台的环境。但在实际的开发过程中,有时不得不涉及一些底层的编程。比如为了防止软件盗用,我们希望软件只能在指定计算机上运行,所以需要程序读取该机区分于其它计算机的硬件特征,如MAC地址等。作为一种跨平台语言,给Java语言提出了挑战。本文正是针对该问题,提出一种直接用纯Java语言,读去MAC地址的编程方法。

  我们知道,在每一个Java应用程序中都存在着一个与其运行环境相联系的Runtime对象。该对象可执行外部命令、查可用内存等。而多数操作系统都提供有查询该机MAC地址的命令。如在Microsoft的操作系统中,命令IPCONFIG等。本文的思路是在程序中运行一个外部命令,将该命令的运行结果作为一个流(Stream),读取并分析之,进而实现获取MAC地址的目的。

  2 Runtime类

  在每一个Java 应用程序里面,都有惟一的一个Runtime 对象。通过这个Runtime 对象,应用程序可以与其运行环境发生相互作用。

  一般不实例化一个Runtime对象。但是可以通过调用静态方法Runtime.getRuntime( )而获得对当前Runtime对象的引用。Runtime 类的大多数方法是实例方法。

  Runtime 对象的作用主要有:执行外部命令;返回空闲内存;运行垃圾回收器;加载动态库等。

  Applets和其他不可信赖的程序由于没有引起一个安全异常(SecurityException)而不能调用任何的Runtime方法。

  下面的例子演示了怎样使用Runtime 对象运行一个外部命令。

以下是引用片段:

  Process process = Runtime.getRuntime().exec("cmd.exe /c dir");
  process.waitFor();
  :

  Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。第二条语句的目的是等待子进程完成后再往下执行。

  上面的程序在运行时会执行dir命令。如果在Windows95/98下,命令格式可以写成"command.exe /c dir"。开关/C指明后面跟随的字符串是命令,并在执行命令后关闭DOS 窗口。

  方法exec还可以打开一个不可执行的程序,但该文件存在关联的应用程序。以打开一个word文档Mydoc.doc文件为例,Java中可以有以下两种写法:

以下是引用片段:
 exec(""cmd /E:ON /c start MyDoc.doc"");
  exec(" c:Program FilesMicrosoft Officeofficewinword.exe .mydoc.doc");

  在第一种方式中,被执行的命令是start Mydoc.doc,开关E:ON 指定DOS 命令处理器允许命令扩展,而start 命令会开启一个单独的窗口执行所提供的命令。

  执行一个有标准输出的DOS命令,程序执行完后往往不会自动关闭,从而导致Java应用程序阻塞在waitfor( )。导致该现象的原因可能是该命令的输出比较多,而运行窗口的输出缓冲区不够大。解决的办法是,利用Java的Process类提供的方法让Java虚拟机截获DOS运行的标准输出,在waitfor()命令之前读出该缓冲区的内容。以运行命令dir为例,典型的程序如下:

以下是引用片段:
 :
  String line;
  Process process = Runtime.getRuntime().exec("cmd /c dir");
  BufferedReader bufferedReader = new BufferedReader ( new InputStreamReader(process.getInputStream()));
  while ( (line = bufferedReader.readLine()) != -1) System. out.println(line);
  process.waitFor( );
  :3 Process

  Runtime.exec方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获取相关信息。

  抽象类Process封装了一个进程(process),一个正在执行的程序。它主要被当作由Runtime类中的exec( )方法所创建的对象的类型的超类。在抽象类Process中,主要包含了如下一些抽象方法。

  InputStream getInputStream( ):返回一个从进程的out输出流中读输入的输入流。

  OutputStream getOutputStream( ):返回一个从进程的in输入流中写输出的输出流。

  int waitFor( ) throws InterruptedException:返回由进程返回的退出码。这个方法直到调用它的进程中止,才会返回。

  4 程序编写

  我们先来分析ipconfig/all的输出格式:

  图1
点击放大此图片

  从图1中我们看到MAC地址包含的行为:“ Physical Address. . . . . . . . . : 00-10-DC-A9-0B-2C”。为了找到MAC地址,我们一行一行读取字符,只要找到字符串“ Physical Address. . . . . . . . . :”,就可以找到MAC地址了。下面是实现的程序片段:

以下是引用片段:

  Process process = Runtime.getRuntime().exec("cmd /c ipconfig /all");
  BufferedReader bufferedReader =
  new BufferedReader(new InputStreamReader (process.getInputStream()));
  while ( (line=bufferedReader.readLine()) != null){
  if(line.indexOf("Physical Address. . . . . . . . . :") != -1){
  if(line.indexOf(":") != -1){
  physicalAddress = line.substring(line.indexOf(":")+2);
  :

  在上面的程序中,为了读取命令输出的字符,利用子进程process生成了一个数据流缓冲区。

  依据上面的代码,我们编写了一个类ReadMAC,见下面程序的源代码:

以下是引用片段:
import java.io.*;
  public class ReadMAC {
  public static String physicalAddress = "read MAC error!";
  public ReadMAC() {
  }
  public static String checkPhysicalAddress(){
  try{
  String line;
  Process process = Runtime.getRuntime().exec("cmd /c ipconfig /all");
  BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
  while ( (line=bufferedReader.readLine()) != null){
  if(line.indexOf("Physical Address. . . . . . . . . :") != -1){
  if(line.indexOf(":") != -1){
  physicalAddress = line.substring(line.indexOf(":")+2);
  break; //找到MAC,推出循环
  }
  }
  }
  process.waitFor();
  }catch(Exception e){
  e.printStackTrace();
  }
  return physicalAddress;
  }
  public static void main(String[] args) {
  System.out.println("本机的MAC地址是: "+ ReadMAC.checkPhysicalAddress());
  }
  }

  编译运行该程序的输出结果如图2所示。

  图2

  由于每一台计算机的MAC地址都不同,所以该程序在不同计算机上运行结果都会不一样。

  5 结束语

  作为一个跨平台语言,编写的JAVA程序一般都与硬件无关,因而能运行在不同的操作系统环境。但这给编写底层相关的程序时带来不便。

  Java的应用程序都存在着一个与其运行环境相联系的Runtime对象,利用该对象可执行外部命令,在WindowsXP/NT/2000环境中的命令IPCONFIG的输出包含有MAC地址。本文编写的Java程序,执行外部命令IPCONFIG,并通过分析该命令的输入流而获得本机的MAC地址。由于IPCONFIG命令是操作系统命令,所以该方法既方便又可靠。

  以上讨论的程序适合于Windows XP/NT/2000操作系统,因为它是基于该操作系统的命令IPCONFIG格式的。由于不同操作系统读取MAC地址的命令、以及命令输出格式的不同,所以该程序不能直接运用到其它系统。要移植到其它系统只需针对命令的输出格式稍作修改。


(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
用AJAX编写用户注册时的应用实例
如何有效防止Java程序源码被人偷窥?
从结对编程到结对工作
Java开发人员的十大戒律
学习java的网站
惠普向联想戴尔宣战 拆卸对手产品指责宏基抄袭
 
最近评论:
        
鍥炲
        
如果真的有来生!
四川旅游,九寨沟旅游,稻城亚丁旅游,四姑娘山旅游,海螺沟旅游,西藏旅游, max(7761)
        
那天的情景!
Maple Story mesos,MapleStory mesos,ms mesos,mesos,SilkRoad Gold, max(1876)
        
轻轻走过你的窗前!
world of warcraft gold,cheap world of warcraft gold,warcraft gold,world of warcraft gold,cheap world of warcraft gold,warcraft gold max(6074)
        
快乐情人节!
wow gold,wow gold,wow gold,wow gold,wow gold,wow gold,wow gold buy wow gold for cheap. max(9833)
        
昨夜的狂想曲!
wow gold,WoW Gold,world of warcraft gold,WoW Gold, max(6770)
        
没有情人的情人节!
wow gold,wow power leveling.wow power leveling,wow power leveling, max(801)
        
没有情人的情人节!
wow gold,wow power leveling.wow power leveling,wow power leveling, max(5052)
        
回复:用纯JAVA语言编程读取MAC地址的实现
guild wars gold gw gold Maple Story Mesos Maple Mesos cheap guild wars gold guild wars money buy guild wars gold gw money cheap guild wars money cheap gw money MapleStory Mesos Maple Story Meso buy Maple Story Mesos cheap Maple Story Mesos buy Maple Meso cheap MapleStory Mesos cheap Maple Story Meso
        
见到你的笑!
maplestory mesos,maplestory mesos,maplestory mesos, maple story mesos, max(8401)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号