方法一:将本机地址与局域网内其他机器区分开来
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