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

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            46 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks

              最近在做一個客戶端監(jiān)控的功能,需要提取用戶電腦的CPU編號和網(wǎng)卡的編號,采集用戶的登陸數(shù)據(jù),據(jù)我所知道直接通過Java來調(diào)用操作系統(tǒng)的信息是非常困難的事情(我好像沒有發(fā)現(xiàn)JavaAPI提供了這個功能),那這樣的話只能通過JNI訪問系統(tǒng)的信息了,不過有個SWT擴展的插件org.eclipse.swt.extension封裝了調(diào)用DLL的JNI方法,主要是負責(zé)底層操作系統(tǒng)的方法,不過可能會對程序的跨平臺性有點的影響,目前只能使用于Windows操作系統(tǒng),使用方法很簡單,接下來請看:
           
             我們可以從http://www.sourceforge.net 上下載這個插件,直接搜索 swt extension 就可以搜到,新建一個工程,比如名稱叫org.vwpolo.extend.example,這里要新建成一個插件項目,如果新建成個簡單的Java工程的時候會出現(xiàn)個找不到類的異常java.lang.NoClassDefFoundError: org/eclipse/swt/internal/win32/OS,項目新建好了后我們可以寫個類來測試一下,我寫的測試類為:

           1 import org.eclipse.swt.internal.extension.Extension;
           2 
           3 /**
           4  * 獲得操作系統(tǒng)的信息  。 
           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("系統(tǒng)登陸帳號: "+Extension.GetUserName());
          12     System.out.println("系統(tǒng)CPU編號: " + Extension.GetCPUID());
          13     System.out.println("系統(tǒng) 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 }
             /**
              * 將十進制轉(zhuǎn)換成十六進制  。
              * @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 

          這個類功能相當(dāng)?shù)暮唵危业捻椖康奈募Y(jié)構(gòu)為


           注意要使程序順利運行,必須要導(dǎo)入 swt-extension-win32.dll 這個文件,由于文件下載下來后有三個DLL文件,還有兩個是swt-gdip-win32.dll和swt-win32.dll,如果將他們?nèi)繉?dǎo)入進來結(jié)果會拋出個這樣的異常
          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)
          這個異常出現(xiàn)的原因是找不到DLL文件或者是多個DLL文件沖突所造成的,去掉其他的DLL文件只要導(dǎo)入swt-extension-win32.dll, 運行,這是控制臺打印的結(jié)果:
          計算機名稱: THINKPAD
          系統(tǒng)登陸帳號: vwpolo
          系統(tǒng)CPU編號: BFEBFBFF00000F64
          -0000000000000000
          系統(tǒng) MAC編號: 00-01-6C-44-C5-??
          不過值得注意的是用這個辦法在配置雙網(wǎng)卡的電腦上會運行不正常,我這里就碰到獲取不到網(wǎng)卡的情況,如果你是使用JDK 6.0的話,現(xiàn)在可以通過這種方式獲得網(wǎng)卡信息:
            /**
             * JDK1.6新特性獲取網(wǎng)卡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 閱讀(2302) 評論(4)  編輯  收藏 所屬分類: Java 技術(shù)SWT JFace

          Feedback

          # re: 使用SWT擴展調(diào)用操作系統(tǒng)的信息 2009-06-03 17:08 Always BaNg.
          其實swt extension 32的作者就在blogjava上

          cnfree.blogjava.net  回復(fù)  更多評論
            

          # re: 使用SWT擴展調(diào)用操作系統(tǒng)的信息 2009-06-04 10:08 VWPOLO
          @Always BaNg.
          呵呵,BlogJava里面高手如云,很希望能認識一下  回復(fù)  更多評論
            

          # re: 使用SWT擴展調(diào)用操作系統(tǒng)的信息 2009-06-09 10:44 VWPOLO
          對了,用這個插件調(diào)用網(wǎng)卡信息好像得到的信息好像不正確,不知道新的版本會不會修正這個問題  回復(fù)  更多評論
            

          # re: 使用SWT擴展調(diào)用操作系統(tǒng)的信息[未登錄] 2009-10-30 09:17 vwpolo
          對了,原來這個方式獲得的網(wǎng)卡信息是十進制的,需要將它轉(zhuǎn)換成十六進制的這樣才能在操作系統(tǒng)的命令行中輸入ipconfig顯示的信息一致  回復(fù)  更多評論
            

          主站蜘蛛池模板: 喜德县| 永平县| 体育| 甘肃省| 都匀市| 巴彦县| 紫云| 定州市| 榆社县| 郎溪县| 大安市| 通化县| 玛沁县| 云阳县| 博兴县| 肇州县| 大城县| 凤山县| 诏安县| 治多县| 赣榆县| 都匀市| 平乡县| 临泉县| 镇宁| 铁岭市| 张家港市| 屏东市| 平阳县| 平南县| 酉阳| 莫力| 静海县| 永年县| 巴里| 清苑县| 屏边| 巴青县| 会昌县| 凤城市| 车致|