采用调用系统命令方式读取MAC地址:
nbtstat -a IP
设置防火墙:允许传入回显请求
允许例外:文件和打印机共享
在用process调用cmd执行命令时,出现了一个小插曲,Process.waitFor() 方法阻塞问题。
首先来解释一下 waitFor() 方法的意义, waitFor() 表示当前 Process 所在的子线程处于等待状态,如有必要,一直要等到由该 Process 对象表示的进程已经终止,网上说如果我们在调用此方法时,如果不注意的话,很容易出现主线程阻塞, Process 也挂起的情况。这就是我遇到的问题,网上的解决办法是,在调用 waitFor() 的时候, Process 需要向主线程汇报运行状况,所以要注意清空缓存区,即 InputStream 和 ErrorStream ,注意这里 InputStream 和 ErrorStream 都需要清空。
具体操作如下:
public static String checkPhysicalAddress(String IP) {
Process process=null;
String s="";
try {
process = Runtime.getRuntime().exec("cmd /c nbtstat -a "+IP);
InputStream stderr = process.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String msg = null;
while ((msg = bufferedReader.readLine()) != null) {
if (msg.indexOf("MAC Address") > 1) {
s += msg.substring(msg.indexOf("MAC Address") + 14, msg.length());
break;
}
}
while (br.readLine() != null) {
}
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
if( process.exitValue() != 0) {
process.destroy();
}
System.out.println(s);
return s;
}