本文给大家汇总介绍了下使用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"));
- }
- }
新闻热点
疑难解答
图片精选