当前位置: 移动技术网 > IT编程>开发语言>Java > java实现获取用户的MAC地址

java实现获取用户的MAC地址

2019年07月22日  | 移动技术网IT编程  | 我要评论

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

/**
   * 根据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"));
   }
  
}

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网