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"));
   }

}
(0)

相关推荐

  • java 获取mac地址的两种方法(推荐)

    我在网上找了一下获取mac地址的方法,找了两种比较不太一样的方法. 第一种 public static void main(String[] args) throws Exception { InetAddress ia = InetAddress.getLocalHost(); System.out.println(getMACAddress(ia)); } private static String getMACAddress(InetAddress ia) throws Exception

  • java通过ip获取客户端Mac地址的小例子

    复制代码 代码如下: package com.yswc.dao.sign; 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 { publi

  • Java获取mac地址的方法

    本文实例讲述了Java获取mac地址的方法.分享给大家供大家参考.具体如下: /* * GetMacAddress .java * * description:get Mac addreess * * @author hadeslee * * Created on 2007-9-27, 9:11:15 * * To change this template, choose Tools | Templates * and open the template in the editor. */ pa

  • Java 获取本机的IP与MAC地址实现详解

     Java 获取本机的IP与MAC地址 有些机器有许多虚拟的网卡,获取IP地址时会出现一些意外,所以需要一些验证: // 获取mac地址 public static String getMacAddress() { try { Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces(); byte[] mac = null; while (allNetInterfaces.ha

  • 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 Au

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

    java实现获取用户的MAC地址方法: 方法一:将本机地址与局域网内其他机器区分开来 /** * 根据IP地址获取mac地址 * @param ipAddress 127.0.0.1 * @return * @throws SocketException * @throws UnknownHostException */ public static String getLocalMac(String ipAddress) throws SocketException, UnknownHostEx

  • Java中使用HttpRequest获取用户真实IP地址

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid,nginx等反向代理软件就不能获取到客户端的真实IP地址了. 如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.jb51.net / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110

  • 基于nginx反向代理获取用户真实Ip地址详解

    目录 引言 1.修改Nginx配置: 2.java获取客户端Ip 附:一个ip工具类 总结 引言 nginx做反向代理时,默认的配置后端获取到的Ip地址都来自于nginx,用request.getRemoteAddr();获取到的是nginx的ip地址,而不是用户的真实ip. 1.修改Nginx配置: server { listen 80; server_name jenkins.local.com; location / { proxy_set_header Host $host; proxy

  • iOS如何获取手机的Mac地址

    首先说明下,下面两种方法均可以获得手机的mac地址,但是有个限制,是在iOS7以下才可以获得.iOS7以后苹果对于sysctl和ioctl进行了技术处理,MAC地址返回的都是02:00:00:00:00:00. 官方文档上这样写的: "Twolow-level networking APIs that used to return a MAC address now return thefixed value 02:00:00:00:00:00. The APIs in question are

  • PHP获取用户访问IP地址的5种方法

    本文实例为大家分享了5种PHP获取用户访问IP地址的方法,供大家参考,具体内容如下 <?php //方法1: $ip = $_SERVER["REMOTE_ADDR"]; echo $ip; //方法2: $user_IP = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"]; $user_IP = ($

  • python获取本机mac地址和ip地址的方法

    本文实例讲述了python获取本机mac地址和ip地址的方法.分享给大家供大家参考.具体如下: import sys, socket def getipaddrs(hostname): result = socket.getaddrinfo(hostname,None,0,socket.SOCK_STREAM) return [x[4][0] for x in result] # the name of the local machine hostname = socket.gethostnam

  • php获取网卡的MAC地址支持WIN/LINUX系统

    复制代码 代码如下: <?php /** 获取网卡的MAC地址原码:目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetMacAddr{ var $return_array = array(); // 返回带有MAC地址的字串数组 var $mac_addr; function GetMacAddr($os_type){ switch ( strtolower($os_type) ){ case "linux": $this->for

  • 微信小程序如何获取用户收货地址

    获取用户收货地址需要用户点击授权,所以有两种情况,确认授权.取消授权. 情况一,用户第一次访问用户地址授权,并且点击确定授权. 情况二,用户点击取消授权后,再次获取授权 流程: (代码逻辑整理) 1.点击事件触发函数,获取用户当前设置 2.根据用户当前设置中的用户授权结果,判断是否包含收货地址授权 3.如果包含收货地址授权并且没有取消过收货地址授权,直接调用wx.chooseAddress(),获取用户收货地址. 4.取消过收货地址授权,调用wx.openSetting(),调起客户端小程序设置

  • java如何获取本机IP地址

    本文实例为大家分享了java实现获取本机IP地址的具体代码,供大家参考,具体内容如下 原因:同一台机子上开着两个web工程,现在有需求需要保证两个项目之间交互的安全问题.因为有个旧的项目,所以尽量不做改动.只能在新项目中做改动. 处理办法:获取本地的IP地址,有请求进来时查看请求的来源,只有来源是本地IP的才予以通过. 代码如下: /** * 任务调度调用拦截器 */ public class TaskControlInterceptor implements Interceptor { //存

随机推荐