服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - java 获取用户的MAC地址多种方法实例详解

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

2020-09-14 13:582cto Java教程

这篇文章主要介绍了JAVA实现获取用户的MAC地址的多种方法实例,需要的朋友可以参考下

java实现获取用户的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
/**
  * 根据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
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
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
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"));
  }
 }

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

原文链接:http://www.2cto.com/kf/201703/618455.html

延伸 · 阅读

精彩推荐