8
回答
java 无法根据ip地址获取mac地址
终于搞明白,存储TCO原来是这样算的>>>   

现在要实现的功能是根据IP地址获取Mac地址。

java代码如下:

public String  getMacAddressByIp(String ip) throws UnknownHostException, SocketException {
    String str = "";
    String macAddress = "";
    String line = "";
    try {
        Process p = Runtime.getRuntime().exec("cmd /c nbtstat -A" + ip);
        InputStreamReader ir = new InputStreamReader(p.getInputStream());
        BufferedReader br = new BufferedReader(ir);
        while((line = br.readLine()) != null){
            if(line != null){
                int index = line.indexOf("MAC Address");
                if(index != -1){
                    macAddress = line.substring(index + "MAC Address".length() ).trim().toUpperCase();
                }
            }
        }
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return macAddress;
}

 

但是br.readLine() 的返回结果为null.因此获取不到mac地址。

直接用cmd打开控制台,输入 nbtstat -A 10.0.1.203,但是也获取不到mac地址。求教各位,谢谢

 

 

<无标签>
举报
小栗子hl
发帖于6天前 8回/217阅
共有8个答案 最后回答: 6天前
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
/**
 * 获取客户端mac地址
 */
public class MacUtil {
	private static final Logger log = LoggerFactory
			.getLogger(MacUtil.class);
	/**
	 * 获取当前操作系统名称. return 操作系统名称 例如:windows,Linux,Unix等.
	 */
	public static String getOSName() {
		return System.getProperty("os.name").toLowerCase();
	}

	/**
	 * 获取Unix网卡的mac地址.
	 * 
	 * @return mac地址
	 */
	public static String getUnixMACAddress() {
		String mac = null;
		BufferedReader bufferedReader = null;
		Process process = null;
		try {
			/**
			 * Unix下的命令,一般取eth0作为本地主网卡 显示信息中包含有mac地址信息
			 */
			process = Runtime.getRuntime().exec("ifconfig eth0");
			bufferedReader = new BufferedReader(new InputStreamReader(
					process.getInputStream()));
			String line = null;
			int index = -1;
			while ((line = bufferedReader.readLine()) != null) {
				/**
				 * 寻找标示字符串[hwaddr]
				 */
				index = line.toLowerCase().indexOf("hwaddr");
				/**
				 * 找到了
				 */
				if (index != -1) {
					/**
					 * 取出mac地址并去除2边空格
					 */
					mac = line.substring(index + "hwaddr".length() + 1).trim();
					break;
				}
			}
		} catch (IOException e) {
			if (log.isErrorEnabled()) {
				log.error(e.getMessage(), e);
			}
		} finally {
			try {
				if (bufferedReader != null) {
					bufferedReader.close();
				}
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			bufferedReader = null;
			process = null;
		}
		return mac;
	}

	/**
	 * 获取Linux网卡的mac地址.
	 * 
	 * @return mac地址
	 */
	public static String getLinuxMACAddress() {
		String mac = null;
		BufferedReader bufferedReader = null;
		Process process = null;
		try {
			/**
			 * linux下的命令,一般取eth0作为本地主网卡 显示信息中包含有mac地址信息
			 */
			process = Runtime.getRuntime().exec("ifconfig eth0");
			bufferedReader = new BufferedReader(new InputStreamReader(
					process.getInputStream()));
			String line = null;
			int index = -1;
			while ((line = bufferedReader.readLine()) != null) {
				index = line.toLowerCase().indexOf("硬件地址");
				/**
				 * 找到了
				 */
				if (index != -1) {
					/**
					 * 取出mac地址并去除2边空格
					 */
					mac = line.substring(index + 4).trim();
					break;
				}
			}
		} catch (IOException e) {
			if (log.isErrorEnabled()) {
				log.error(e.getMessage(), e);
			}
		} finally {
			try {
				if (bufferedReader != null) {
					bufferedReader.close();
				}
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			bufferedReader = null;
			process = null;
		}

		return mac;
	}

	/**
	 * 获取widnows网卡的mac地址.
	 * 
	 * @return mac地址
	 */
	public static String getWindowsMACAddress() {
		String mac = null;
		BufferedReader bufferedReader = null;
		Process process = null;
		try {
			/**
			 * windows下的命令,显示信息中包含有mac地址信息
			 */
			process = Runtime.getRuntime().exec("ipconfig /all");
			bufferedReader = new BufferedReader(new InputStreamReader(
					process.getInputStream(), "GBK")); // windows系统都是GBK编码,不加GBK读出的中文是乱码
			String line = null;
			int index = -1;
			while ((line = bufferedReader.readLine()) != null) {
				/**
				 * 寻找标示字符串[physical address]
				 */
				index = line.toLowerCase().indexOf("physical address");
				if (index == -1) {
					/**
					 * 寻找标示字符串[物理地址]
					 */
					index = line.toLowerCase().indexOf("物理地址");
					 
				}

				if (index != -1) {
					index = line.indexOf(":");
					if (index != -1) {
						/**
						 * 取出mac地址并去除2边空格
						 */
						mac = line.substring(index + 1).trim();
					}
					break;
				}
			}
		} catch (IOException e) {
			if (log.isErrorEnabled()) {
				log.error(e.getMessage(), e);
			}
		} finally {
			try {
				if (bufferedReader != null) {
					bufferedReader.close();
				}
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			bufferedReader = null;
			process = null;
		}
		return mac;
	}

	/**
	 * 获取widnows网卡的mac地址.
	 * 
	 * @return mac地址
	 */
	public static String getWindowsMACAddress(String ip) {
		String mac = null;
		BufferedReader bufferedReader = null;
		Process process = null;
		try {
			/**
			 * windows下的命令,显示信息中包含有mac地址信息
			 */
			// process = Runtime.getRuntime().exec("ipconfig /all");
			process = Runtime.getRuntime().exec("nbtstat -A " + ip);
			bufferedReader = new BufferedReader(new InputStreamReader(
					process.getInputStream(), "GBK")); // windows系统都是GBK编码,不加GBK读出的中文是乱码
			String line = null;
			int index = -1;
			while ((line = bufferedReader.readLine()) != null) {
				/**
				 * 寻找标示字符串[physical address]
				 */
 				index = line.toLowerCase().indexOf("mac 地址 =");
				 
				if (index != -1) {
					index = line.indexOf("=");
					if (index != -1) {
						/**
						 * 取出mac地址并去除2边空格
						 */
						mac = line.substring(index + 1).trim();
					}
					break;
				}
			}
		} catch (IOException e) {
			if (log.isErrorEnabled()) {
				log.error(e.getMessage(), e);
			}
		} finally {
			try {
				if (bufferedReader != null) {
					bufferedReader.close();
				}
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			bufferedReader = null;
			process = null;
		}
		return mac;
	}

	/**
	 * 获取客户端mac
	 * 
	 * @description {TODO}
	 * @return
	 */
	public static String getMACAddress(String ip) {
		String os = getOSName();
		String mac = "";
		if (os.startsWith("windows")) {
			mac = getWindowsMACAddress(ip);
		} else if (os.startsWith("linux")) {
			mac = getLinuxMACAddress();
		} else {
			mac = getUnixMACAddress();
		}
		return mac;
	}

	/**
	 * 测试用的main方法.
	 * 
	 * @param argc
	 *            运行参数.
	 */
	public static void main(String[] argc) {
		String os = getOSName();
		 
		if (os.startsWith("windows")) {
			String mac = getWindowsMACAddress();
		 
		} else if (os.startsWith("linux")) {
			String mac = getLinuxMACAddress();
			 
		} else {
			String mac = getUnixMACAddress();
 
		}
	}

}

Try 一 Try

--- 共有 4 条评论 ---
gm100861 回复 @南北024 : 真是服了你们这些个喷子,你以为我没试?是我没试还是你没试啊,兄弟. 4天前 回复
南北024也不看看就贴大段代码, 5天前 回复
小栗子hl我是cmd 直接输出nbtstat -A + ip都不能输出ip地址哎 6天前 回复
sprouting取出的地址好像不对啊 6天前 回复

这个也只能用于获得运行该程序电脑而且是操作系统是windows的mac地址

 要是有能用于web的根据访问ip获得访问者的mac地址的方法就好了

--- 共有 1 条评论 ---
sprouting嗯,是的,之前也做过这个东西,java无法获取到mac地址,最多是获取到本地局域网的,要获取只能用js之类的控件来弄,但是由于安全性,很多浏览器不支持 6天前 回复

首先mac地址和IP地址本身就没有必然联系吧,其次用命令行都获取不到那代码更获取不到。楼主可以不使用nbtstat,尝试下snmp4j开发包行不行。

如果要是在通一个网段内 ,使用snmp 可以获取到,如果要是不在同一网段,这个问题是 无解的。除非是通过交换机中得路由表获取

顶部