package com.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
public class GetMac {
/**
* java獲取客戶端網卡的MAC地址
*
* @param args
*/
public static void main(String[] args) {
GetMac get = new GetMac();
System.out.println("1="+get.getMAC());
System.out.println("2="+get.getMAC("192.168.0.9"));
}
// 1.獲取客戶端ip地址( 這個必須從客戶端傳到後臺):
// jsp頁面下,很簡單,request.getRemoteAddr() ;
// 因爲系統的VIew層是用JSF來實現的,因此頁面上沒法直接獲得類似request,在bean裏做了個強制轉換
// public String getMyIP() {
// try {
// FacesContext fc = FacesContext.getCurrentInstance();
// HttpServletRequest request = (HttpServletRequest) fc
// .getExternalContext().getRequest();
// return request.getRemoteAddr();
// } catch (Exception e) {
// e.printStackTrace();
// }
// return "";
// }
// 2.獲取客戶端mac地址
// 調用window的命令,在後臺Bean裏實現 通過ip來獲取mac地址。方法如下:
// 運行速度【快】
public String getMAC() {
String mac = null;
try {
Process pro = Runtime.getRuntime().exec("cmd.exe /c ipconfig/all");
InputStream is = pro.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,"GBK"));
String message = br.readLine();
int index = -1;
while (message != null) {
if ((index = message.indexOf("Physical Address")) > 0) {
mac = message.substring(index + 36).trim();
break;
}
message = br.readLine();
}
System.out.println(mac);
br.close();
pro.destroy();
} catch (IOException e) {
System.out.println("Can't get mac address!");
return null;
}
return mac;
}
// 運行速度【慢】
public String getMAC(String ip) {
String str = null;
String macAddress = null;
try {
Process p = Runtime.getRuntime().exec(" nbtstat -A " + ip);
InputStreamReader ir = new InputStreamReader(p.getInputStream(), "GBK");
LineNumberReader input = new LineNumberReader(ir);
for (; true;) {
str = input.readLine();
System.out.println(str);
if (str != null) {
if (str.indexOf("MAC Address") > 1) {
macAddress = str
.substring(str.indexOf("MAC Address") + 14);
break;
}
}
}
} catch (IOException e) {
e.printStackTrace(System.out);
return null;
}
return macAddress;
}
}
解決方案如下
C:\\Windows\\system32\\nbtstat.exe在程序中調,是找不到的。
是64位系統的產生的原因,把命令改成“cmd /c C:\\Windows\\sysnative\\nbtstat.exe -a 192.168.44.1”就可以了,至於sysnative是什麼意思,自行網上查查。
你的代碼之所以不打印任何東西,也不輸出錯誤信息,是因爲用了process.getInputStream(),它是獲取到了std_out,而由於前面說的,找不到C:\\Windows\\system32\\nbtstat.exe,會在std_err輸出錯誤信息,所以你把process.getInputStream()改成getErrorStream()就可以了,它會把錯誤信息打出來。