好好生活,努力工作,天天向上!

BlogJava 首页 新随笔 联系 聚合 管理
  46 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks

    最近在做一个客户端监控的功能,需要提取用户电脑的CPU编号和网卡的编号,采集用户的登陆数据,据我所知道直接通过Java来调用操作系统的信息是非常困难的事情(我好像没有发现JavaAPI提供了这个功能),那这样的话只能通过JNI访问系统的信息了,不过有个SWT扩展的插件org.eclipse.swt.extension封装了调用DLL的JNI方法,主要是负责底层操作系统的方法,不过可能会对程序的跨平台性有点的影响,目前只能使用于Windows操作系统,使用方法很简单,接下来请看:
 
   我们可以从http://www.sourceforge.net 上下载这个插件,直接搜索 swt extension 就可以搜到,新建一个工程,比如名称叫org.vwpolo.extend.example,这里要新建成一个插件项目,如果新建成个简单的Java工程的时候会出现个找不到类的异常java.lang.NoClassDefFoundError: org/eclipse/swt/internal/win32/OS,项目新建好了后我们可以写个类来测试一下,我写的测试类为:

 1 import org.eclipse.swt.internal.extension.Extension;
 2 
 3 /**
 4  * 获得操作系统的信息  。 
 5  * @author 刘尧兴
 6  * <p>2009-6-3</p>
 7  */
 8 public class GetOSInfoApp {
 9   public static void main(String[] args) {
10     System.out.println("计算机名称: "+Extension.GetComputerName());
11     System.out.println("系统登陆帐号: "+Extension.GetUserName());
12     System.out.println("系统CPU编号: " + Extension.GetCPUID());
13     System.out.println("系统 MAC编号: " + getMacId());
14   }

        public static String getMacID() {
          int[] macs = Extension.GetMACAddress(0);
          StringBuffer stringBuffer = new StringBuffer();
         for (int i = 0; i < macs.length; i++) {
            stringBuffer.append(getHexString(macs[i], 2).toUpperCase());
            if (i != macs.length - 1)
            stringBuffer.append("-");
        }
        return stringBuffer.toString();
15 }
   /**
    * 将十进制转换成十六进制  。
    * @author 刘尧兴
    * @param value
    * @param length
    * @return String
   */
   public static String getHexString(int value, int length) {
       String valueStr = Integer.toHexString(value);
       if(valueStr.length() == length)
         return valueStr;
       if(valueStr.length() > length)
         return valueStr.substring(0, length);
       valueStr = "0000"+valueStr;
       return valueStr.substring(valueStr.length()-length);
     }
16 

这个类功能相当的简单,我的项目的文件结构为


 注意要使程序顺利运行,必须要导入 swt-extension-win32.dll 这个文件,由于文件下载下来后有三个DLL文件,还有两个是swt-gdip-win32.dll和swt-win32.dll,如果将他们全部导入进来结果会抛出个这样的异常
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.eclipse.swt.internal.C.PTR_sizeof()I
       at org.eclipse.swt.internal.C.PTR_sizeof(Native Method)
       at org.eclipse.swt.internal.C.
<clinit>(C.java:24)
       at org.vwpolo.extend.example.GetSystemInfoApp.main(GetSystemInfoApp.java:
6)
这个异常出现的原因是找不到DLL文件或者是多个DLL文件冲突所造成的,去掉其他的DLL文件只要导入swt-extension-win32.dll, 运行,这是控制台打印的结果:
计算机名称: THINKPAD
系统登陆帐号: vwpolo
系统CPU编号: BFEBFBFF00000F64
-0000000000000000
系统 MAC编号: 00-01-6C-44-C5-??
不过值得注意的是用这个办法在配置双网卡的电脑上会运行不正常,我这里就碰到获取不到网卡的情况,如果你是使用JDK 6.0的话,现在可以通过这种方式获得网卡信息:
  /**
   * JDK1.6新特性获取网卡MAC地址
   * 
@return String
   
*/
  
private static String getMac() {
    
try {
      Enumeration
<NetworkInterface> el = NetworkInterface.getNetworkInterfaces();
      
while (el.hasMoreElements()) {
        
byte[] mac = el.nextElement().getHardwareAddress();
        
if (mac == null)
          
continue;

        StringBuilder builder 
= new StringBuilder();
        
for (byte b : mac) {
          builder.append(hexByte(b));
          builder.append(
"-");
        }
        builder.deleteCharAt(builder.length() 
- 1);
        
return builder.toString();

      }
    }
    
catch (Exception exception) {
      exception.printStackTrace();
    }
    
return null;
  }
posted on 2009-06-03 09:52 VWPOLO 阅读(2285) 评论(4)  编辑  收藏 所属分类: Java 技术SWT JFace

Feedback

# re: 使用SWT扩展调用操作系统的信息 2009-06-03 17:08 Always BaNg.
其实swt extension 32的作者就在blogjava上

cnfree.blogjava.net  回复  更多评论
  

# re: 使用SWT扩展调用操作系统的信息 2009-06-04 10:08 VWPOLO
@Always BaNg.
呵呵,BlogJava里面高手如云,很希望能认识一下  回复  更多评论
  

# re: 使用SWT扩展调用操作系统的信息 2009-06-09 10:44 VWPOLO
对了,用这个插件调用网卡信息好像得到的信息好像不正确,不知道新的版本会不会修正这个问题  回复  更多评论
  

# re: 使用SWT扩展调用操作系统的信息[未登录] 2009-10-30 09:17 vwpolo
对了,原来这个方式获得的网卡信息是十进制的,需要将它转换成十六进制的这样才能在操作系统的命令行中输入ipconfig显示的信息一致  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: