首页 > 编程 > Java > 正文

java 获取用户的MAC地址多种方法实例详解

2019-11-26 12:33:04
字体:
来源:转载
供稿:网友

java实现获取用户的MAC地址方法:

方法一:将本机地址与局域网内其他机器区分开来

/**  * 根据IP地址获取mac地址  * @param ipAddress 127.0.0.1  * @return  * @throws SocketException  * @throws UnknownHostException  */ public static String getLocalMac(String ipAddress) throws SocketException,   UnknownHostException {  // TODO Auto-generated method stub  String str = "";  String macAddress = "";  final String LOOPBACK_ADDRESS = "127.0.0.1";  // 如果为127.0.0.1,则获取本地MAC地址。  if (LOOPBACK_ADDRESS.equals(ipAddress)) {   InetAddress inetAddress = InetAddress.getLocalHost();   // 貌似此方法需要JDK1.6。   byte[] mac = NetworkInterface.getByInetAddress(inetAddress)     .getHardwareAddress();   // 下面代码是把mac地址拼装成String   StringBuilder sb = new StringBuilder();   for (int i = 0; i < mac.length; i++) {    if (i != 0) {     sb.append("-");    }    // mac[i] & 0xFF 是为了把byte转化为正整数    String s = Integer.toHexString(mac[i] & 0xFF);    sb.append(s.length() == 1 ? 0 + s : s);   }   // 把字符串所有小写字母改为大写成为正规的mac地址并返回   macAddress = sb.toString().trim().toUpperCase();   return macAddress;  } else {   // 获取非本地IP的MAC地址   try {    System.out.println(ipAddress);    Process p = Runtime.getRuntime()      .exec("nbtstat -A " + ipAddress);    System.out.println("===process=="+p);    InputStreamReader ir = new InputStreamReader(p.getInputStream());          BufferedReader br = new BufferedReader(ir);        while ((str = br.readLine()) != null) {     if(str.indexOf("MAC")>1){      macAddress = str.substring(str.indexOf("MAC")+9, str.length());      macAddress = macAddress.trim();      System.out.println("macAddress:" + macAddress);      break;     }    }    p.destroy();    br.close();    ir.close();   } catch (IOException ex) {   }   return macAddress;  } }

我们再来看下方法二:

package com.alpha.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("127.0.0.1"));  }   // 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));      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());      LineNumberReader input = new LineNumberReader(ir);      for (; true;) {        str = input.readLine();        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;  }}

方法三,更精简一些:

import java.io.IOException;import java.io.InputStreamReader;import java.io.LineNumberReader;public class MACAddress { String ip; String mac; public MACAddress (String ip){ this.ip = ip; } public MACAddress (){ this.ip = "0.0.0.0"; } public String getMac(){ try { Process p = Runtime.getRuntime().exec("arp -n");  InputStreamReader ir = new InputStreamReader(p.getInputStream());  LineNumberReader input = new LineNumberReader(ir);  p.waitFor();  boolean flag = true;  String ipStr = "(" + this.ip + ")";  while(flag) {  String str = input.readLine();  if (str != null) {   if (str.indexOf(ipStr) > 1) {   int temp = str.indexOf("at");   this.mac = str.substring(   temp + 3, temp + 20);   break;   }  } else  flag = false;  } } catch (IOException | InterruptedException e) {  e.printStackTrace(System.out); } return this.mac; } public void setIp(String ip){ this.ip = ip; }}

最后要放大招了,小伙伴们看仔细哦

首先要说的是:本方法可以支持外网机器的mac地址获取。

以前弄了一个只能访问局域网。 有防火墙就访问不了, 但是这个不用担心了。

测试了百度的ip,已经可以获得mac地址

java通过ip获取mac地址-封ip封mac地址

import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.regex.Matcher;import java.util.regex.Pattern; /*** 获取MAC地址* @author* 2011-12*/public class GetMacAddress {  public static String callCmd(String[] cmd) {    String result = "";    String line = "";    try {     Process proc = Runtime.getRuntime().exec(cmd);     InputStreamReader is = new InputStreamReader(proc.getInputStream());     BufferedReader br = new BufferedReader (is);     while ((line = br.readLine ()) != null) {     result += line;     }    }    catch(Exception e) {     e.printStackTrace();    }    return result;   }  /**   *   * @param cmd 第一个命令   * @param another 第二个命令   * @return 第二个命令的执行结果   */  public static String callCmd(String[] cmd,String[] another) {    String result = "";    String line = "";    try {     Runtime rt = Runtime.getRuntime();     Process proc = rt.exec(cmd);     proc.waitFor(); //已经执行完第一个命令,准备执行第二个命令     proc = rt.exec(another);     InputStreamReader is = new InputStreamReader(proc.getInputStream());     BufferedReader br = new BufferedReader (is);     while ((line = br.readLine ()) != null) {      result += line;     }    }    catch(Exception e) {     e.printStackTrace();    }    return result;   }  /**   *   * @param ip 目标ip,一般在局域网内   * @param sourceString 命令处理的结果字符串   * @param macSeparator mac分隔符号   * @return mac地址,用上面的分隔符号表示   */  public static String filterMacAddress(final String ip, final String sourceString,final String macSeparator) {    String result = "";    String regExp = "((([0-9,A-F,a-f]{1,2}" + macSeparator + "){1,5})[0-9,A-F,a-f]{1,2})";    Pattern pattern = Pattern.compile(regExp);    Matcher matcher = pattern.matcher(sourceString);    while(matcher.find()){     result = matcher.group(1);     if(sourceString.indexOf(ip) <= sourceString.lastIndexOf(matcher.group(1))) {      break; //如果有多个IP,只匹配本IP对应的Mac.     }    }     return result;   }     /**   *   * @param ip 目标ip   * @return Mac Address   *   */  public static String getMacInWindows(final String ip){    String result = "";    String[] cmd = {      "cmd",      "/c",      "ping " + ip      };    String[] another = {      "cmd",      "/c",      "arp -a"     };    String cmdResult = callCmd(cmd,another);    result = filterMacAddress(ip,cmdResult,"-");    return result;   }    /**   * @param ip 目标ip   * @return Mac Address   *   */  public static String getMacInLinux(final String ip){    String result = "";    String[] cmd = {      "/bin/sh",      "-c",      "ping " + ip + " -c 2 && arp -a"     };    String cmdResult = callCmd(cmd);    result = filterMacAddress(ip,cmdResult,":");    return result;   }    /**  * 获取MAC地址   * @return 返回MAC地址  */  public static String getMacAddress(String ip){   String macAddress = "";   macAddress = getMacInWindows(ip).trim();   if(macAddress==null||"".equals(macAddress)){    macAddress = getMacInLinux(ip).trim();   }   return macAddress;  }  //做个测试  public static void main(String[] args) {      System.out.println(getMacAddress("220.181.111.148"));  } }

希望本篇文章可以给您帮助

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表