java实现获取用户的MAC地址

时间:2022-04-17 06:06:16

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/**
   * 根据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;
    }
  }

我们再来看下方法二:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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;
    }
}

方法三,更精简一些

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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地址

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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"));
   }
  
}