三種使用Java獲得獲得電腦網卡方法

來源:互聯網
上載者:User

現在我們的項目現在加入了身分識別驗證,通過收集用戶端的電腦的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系統吧

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.