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

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            46 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks
               現在我們的項目現在加入了身份驗證,通過收集客戶端的電腦的CPU編號、硬盤編號和網卡編號然后生成一個機器碼,然后使用這個機器碼作為身份標識,驗證客戶端的合法性,我們的項目是RCP架構,所以使用了SWT Extension這樣的一個插件(國人開發,而且是BlogJava的會員),這樣比較方便,獲取CPU編號、硬盤編號倒是沒有什么問題,獲取網卡信息的時候有些電腦居然采集不到信息,采集方式是這樣的:
           int[] macs = Extension.GetMACAddress(0);
           
          if(macs == null || macs.length ==0) {
              macs 
          = Extension.GetMACAddress(1);
           }
           
          if(macs == null || macs.length ==0) {
              macs 
          = Extension.GetMACAddress(2);
           }
           
          if(macs == null || macs.length ==0) {
              macs 
          = Extension.GetMACAddress(3);
           }
           StringBuffer stringBuffer 
          = new StringBuffer();
           
          for (int i = 0; i < macs.length; i++) {
                stringBuffer.append(getHexString(macs[i], 
          2)
                
          if (i != macs.length - 1)
                  stringBuffer.append(
          "-");
           }
           System.out.println(stringBuffer.toString.toUpperCase()););

             注意通過Extension.GetMACAddress()方法得到的網卡地址是一個十進制的數組,需要將他轉換成十六進制的,這樣才能和操作系統現在的信息一致。

             這種采集方式不是萬能,估計和操作環境有關系,我們這個項目的按照客戶端大概在4000臺電腦左右,大部分安裝的Windows 2000操作系統、Java運行環境是jre 6.0,通過分析發現有些電腦是雙網卡,我見得最多的一個電腦居然配置了9塊網卡(包括虛擬的和禁用掉的),在這種情況下SWT Extension 是無法正常工作了,網絡上也提供了其他的辦法比如使用
                    String command = "cmd.exe /c ipconfig /all";
                    Process p 
          = Runtime.getRuntime().exec(command);
                    BufferedReader br 
          = new BufferedReader(new InputStreamReader(p.getInputStream()));
                    String line;
                    
          while ((line = br.readLine()) != null) {
                      System.out.println(
          "line:"+line);
                      
          if (line.indexOf("Physical Address"> 0) {
                        
          int index = line.indexOf(":");
                        index 
          += 2;
                        address 
          = line.substring(index);
                        
          break;
                      }
                    }
                    br.close();

          根據返回的輸入流從里面解析信息,通過使用發現這種方式也不太管用!。這里重點介紹第三種方式:通過JDK 6.0中的方法來獲取:
           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;
            }
          這是JDK 6.0的新特性,可以支持多網卡配置,你只需要判斷一下就行
          我的做法是將這三種方法同時使用:如果第一種方式獲取不到,換成第二種,第二種方法也無效的話,我就使用第三種,如果第三種方式仍然無效的話,只能建議客戶重裝系統了:你還是升級到XP系統吧
          posted on 2009-11-01 13:14 VWPOLO 閱讀(4647) 評論(5)  編輯  收藏 所屬分類: Java 技術

          Feedback

          # re: 三種使用Java獲得獲得電腦網卡方法 2009-11-01 22:13 哈哈的日子
          相當不錯啊,沒想到 JDK 6 還有這個新特性。謝謝  回復  更多評論
            

          # re: 三種使用Java獲得獲得電腦網卡方法 2009-11-02 09:28 javest
          哥們,我比較關心你們是怎么得到CPU編號、硬盤編號的,哈,如果可以的話,就介紹一下,是不是調用DLL取CPU編號、硬盤編號的.???  回復  更多評論
            

          # re: 三種使用Java獲得獲得電腦網卡方法 2009-11-02 16:05 咖啡妝
          @javest
          java應該給封裝好了 至于底層有可能是通過jni讀取  回復  更多評論
            

          # re: 三種使用Java獲得獲得電腦網卡方法 2009-11-02 21:12 VWPOLO
          @javest
          可以參考我的另外一篇文章: http://www.aygfsteel.com/vwpolo/archive/2009/06/03/279746.html  回復  更多評論
            

          # re: 三種使用Java獲得獲得電腦網卡方法 2009-11-02 21:13 VWPOLO
          Java獲取這些系統信息大部分是通過JNI調用DLL  回復  更多評論
            

          主站蜘蛛池模板: 稷山县| 铅山县| 怀安县| 仙桃市| 漳平市| 名山县| 吉首市| 汝阳县| 宜章县| 泰顺县| 信丰县| 盐池县| 尼勒克县| 云林县| 城固县| 苍山县| 东台市| 临漳县| 汨罗市| 济南市| 西宁市| 曲靖市| 竹溪县| 侯马市| 绿春县| 长海县| 建宁县| 宁波市| 名山县| 东方市| 罗平县| 隆昌县| 曲周县| 呼玛县| 常州市| 吴忠市| 保康县| 长宁县| 湖口县| 玉门市| 达孜县|