// 通过IP获取网卡地址
private String getMacAddressIP(String remotePcIP) {
String str = "";
String macAddress = "";
try {
Process pp = Runtime.getRuntime().exec("netstat -a " + remotePcIP);
System.out.println("pp = " + pp);
InputStreamReader ir = new InputStreamReader(pp.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
for (int i = 1; i < 100; i++) {
str = input.readLine();
//System.out.println("str = " + str);
if (str != null) {
if (str.indexOf("MAC Address") > 1) {
macAddress = str.substring(
str.indexOf("MAC Address") + 14, str.length());
break;
}
}
}
} catch (IOException ex) {

}
return macAddress;
}

解决方案 »

  1.   

    我想使用这段代码获取mac地址,可copy这段代码下来也不知道该如何解读与显示mac address。运行至
    if (str.indexOf("MAC Address") > 1)  为false,没有MAC Address字符串。
    忘哪位高手帮我再改改,谢谢!  ^_^
      

  2.   

    用ipconfig -all,不是用netstat
      

  3.   

    那你有获取客户端mac地址的资料和代码吗?
      

  4.   

    你贴的那个是linux下的吧,Windows下要用 ipconfig /all你可以命令行下执行一次,看看内容就知道了,过滤关键字str.indexOf("MAC Address")要修改为:物理地址  或  Physical Address
      

  5.   


    那可能跟笔者的版本不同。自己先在命令行下运行下 netstat -a 然后看看物理地址那行的信息是啥样的吧。记录下来,修改对应的“str.indexOf("MAC Address")”匹配条件就行了。
      

  6.   

    另外也可以用另一个命令,直接得到想要的MAC地址。就是:
    ifconfig
    eth0      Link encap:Ethernet  HWaddr 00:03:49:53:D3:16  
              inet addr:192.168.234.128  Bcast:192.168.234.255  Mask:255.255.255.0
              inet6 addr: fe80::20c:29ff:fe33:daf6/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:27 errors:0 dropped:0 overruns:0 frame:0
              TX packets:35 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:3162 (3.0 KiB)  TX bytes:8630 (8.4 KiB)然后配合下过滤命令:
    ifconfig | grep HWaddr用“Runtime”执行直接就得到你要的结果啦。
      

  7.   

    Java不能获取MAC地址,JAVA只能通过IP和类在JVM中的启动时间,
    来唯一确定。(精度达到1/4秒)
      

  8.   

    我之前已经使用过一个方法,也是使用Runtime,但获取是服务器端的。然后我看了别人的资料,说可以通过ip获取到客户端mac。我现在头都大了,网上的答案各种各样的,而且大部分直接把copy的code贴上去,也不测下。  我想得个client mac address 咋就这么难呢?
      

  9.   

    B/S 架构下,想得到Client的MAC地址,除了借助ActiveX外,根本不可能。刚才说的都是取自己(服务器端)的MAC地址。
      

  10.   

    对啊,最头疼的问题就是我用的是firefox browser。
    之前用php获取的也是the server mac address。
    头大了我……  
      

  11.   

    搞个什么browser兼容性嘛,烦死人了…… 
      

  12.   

    放弃该特性吧,这个需求本身就已经是在突破浏览器安全沙箱了。Client端的各类敏感数据可以这么简单的让你用JavaScript之类的脚本就拿到手,那病毒啥的还不疯了。
      

  13.   

    把我比急了,我自己写个applet,nnd……
    不过话又说回来了,既然有这放的要求,就肯定有解答的。
    有人说使用Ajax后台获取,也有人说使用asp获取,也有人说使用java获取,通过servlet传给前台jsp小脚本。nnd,这么多,没一个是我想要的。看到个方法,兴奋一下子。看个答案,测试下,兴奋剂就泄了。比阳痿还快……  -_-  现在一看到ie下的ActiveX组件就来火……  
      

  14.   

    Applet还真不知道行不行,但我个人臆断是:不行,因为Applet的安全沙箱限制也非常严格。通过服务端获取再传给前端之类的说法,基本就是扯淡,可以得到些不一定准确的ClientIP(通过HTTP-HEAD),但绝对得不到MAC地址。FireFox也能有组件,只不过开发两套的话,更幸苦点。之前我们客户也因为安全问题(天朝安全部门介入)强烈要求获取客户端IP地址和MAC地址,所以对这个问题深入研究过一轮了。
      

  15.   

    如果你用 JDK 6 的话,可以直接使用 NetworkInterface 这个类,当中有个 getHardwareAddress() 方法获得的字节数组就是 MAC 地址。
      

  16.   

    Ldh911的兄弟,可否加个qq聊聊,我的qq:505181227,我叫吴圆
      

  17.   

    楼18的兄弟,你说后台获取的方式获取到的mac是server or client?
      

  18.   


    当然是Java代码所运行的地方,也就是Server端。
      

  19.   

    接着18楼的思路,如果用Applet的话,其实跟用插件是类似的。于是查了下,在Applet上使用NetworkInterface有可行性,但需要获得许可:
    http://stackoverflow.com/questions/4525013/applet-not-able-to-access-networkinterface-gethardwareaddress-api
    另外这里有用Applet操作NetworkInterface的样例代码:
    https://forums.oracle.com/forums/thread.jspa?threadID=1144276
    不过具体要怎么配置许可还需要研究。
      

  20.   

    public static void getMACAddress()throws IOException
    {
    InputStreamReader read = null;
    LineNumberReader input = null;
    try {
    Process process = Runtime.getRuntime().exec("ipconfig -all");
     read = new InputStreamReader(process.getInputStream());
     input = new LineNumberReader(read);

    int index = -1;
    while(input.read() != index){
    String readLing = input.readLine()+"";
    if(readLing.contains("Physical Address")){
    System.out.println("获取本机上的Mac地址:"+readLing);
    }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }finally{
    if(input!=null){
    input.close();
    }