【记录】通过IP地址获取局域网中设备的MAC地址——java实现

###一:通过命令ipconfig /all获取本机MAC地址(Windows平台)
在Windows中执行ipconfig /all命令后,会得到下图所示内容:
执行ipconfig /all命令后的界面
可以看出其中就包含着本机的MAC地址,若是我们能用Java执行“ipconfig /all”命令,并获取到上图中的内容,进而便可获取到本机MAC地址。
那么java可以执行Windows命令吗?答案是肯定的。
你可以这样做(将ipconfig /all替换为你想要执行的Windows命令即可):

Runtime.getRuntime().exec("cmd.exe /c ipconfig /all");

下面贴出完整的获取本机MAC地址的代码,以供大家参考

public static void main(String[] args){

		try {
			Process process = Runtime.getRuntime().exec("cmd.exe /c ipconfig /all");
			BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));  
		
			String line;
			while ((line = br.readLine()) != null) {  
                if (line.indexOf("Physical Address") > 0) {  
                	int index = line.indexOf(":");  
                    index += 2;
                    String address = line.substring(index);  
                    System.out.println(address);
                    break;  
                }  
            }  
            br.close();  
            
            
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
}

###二:使用NetworkInterface,通过本机IP或者本机名获取本机MAC地址

通过本机IP地址获取MAC地址

byte[] addr = {(byte) 192,(byte) 168,1,103};
NetworkInterface ne=NetworkInterface.getByInetAddress(InetAddress.InetAddress.getByAddress(addr));
byte[] mac = ne.getHardwareAddress();

根据本机名获取MAC地址

NetworkInterface ne=NetworkInterface.getByInetAddress(InetAddress.getByName("XB-20150408SKNM"));
byte[] mac = ne.getHardwareAddress();

###三、通过IP获取局域网中的其他设备的MAC地址
思路:
先前已经说明:使用java可以执行Windows命令。
1、ping ip
若ping不通则说明此IP不在本局域网内,操作就此终止;
若ping的通,证明此IP在局域网内,然后使用命令arp -a IP获取如下图所示信息:
执行arp -a命令后的界面
2、获取上图中的内容,进而获取到MAC地址。

解释一个问题:为什么要先ping ip呢?
因为arp命令用于显示和修改 “ 地址解析协议 (ARP)” 缓存中的项目。 也就是说局域网中的设备若是没有跟本机(执行arp命令的设备)通信过,那么执行arp命令后是得不到其信息的。
所以我们先ping ip,然后就能之用arp命令查看到对应的信息了。

示例代码:

/**
     * 执行单条指令
     * @param cmd 命令
     * @return 执行结果
     * @throws Exception
     */
    public static String command(String cmd) throws Exception{
        Process process = Runtime.getRuntime().exec(cmd);
        process.waitFor();
        InputStream in = process.getInputStream();
        StringBuilder result = new StringBuilder();
        byte[] data = new byte[256];
        while(in.read(data) != -1){
            String encoding = System.getProperty("sun.jnu.encoding");
            result.append(new String(data,encoding));
        }
        return result.toString();
    }
     
     
    /**
     * 获取mac地址
     * @param ip
     * @return
     * @throws Exception 
     */
    public static String getMacAddress(String ip) throws Exception{
        String result = command("ping "+ip+" -n 2");
        if(result.contains("TTL")){
            result = command("arp -a "+ip);
        }
        String regExp = "([0-9A-Fa-f]{2})([-:][0-9A-Fa-f]{2}){5}";
        Pattern pattern = Pattern.compile(regExp);
        Matcher matcher = pattern.matcher(result);
        StringBuilder mac = new StringBuilder();
        while (matcher.find()) {
            String temp = matcher.group();
            mac.append(temp);
        }
        return mac.toString();
    }

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
	    System.out.println(System.currentTimeMillis());
	    System.out.println(getMacAddress("192.168.1.108"));
	    System.out.println(System.currentTimeMillis());
		
	}

参考资料:
1、最靠谱的JAVA局域网内通过IP地址获取MAC地址(本人亲测)
2、java怎么样获取局域网内活动Ip和主机名
3、怎么样获取局域网的所有IP地址(在不知道主机名的情况下)

更多精彩资讯,请扫码关注。

已标记关键词 清除标记
相关推荐
利用jmdns发现局域网设备,在局域网内,你要通过一台主机和其他主机进行通信,你需要知道对方的ip地址,但是有些时候,你并不知道对方的ip地址,因为一般使用DHCP动态分配ip地址局域网内,各个主机的IP地址是由DHCP服务器来帮你分配IP地址的。所以在很多情况下,你要知道对方的IP地址是比较麻烦的。 鉴于发现这篇文章最近的浏览量比较多,晚上也有不少转载,特别声明一下,文章水平可能不大够,只是我当时的一些理解,所以希望大家以批判的角度来看,然后又什么问题欢迎讨论。真心不希望误导大家^_^ mDNS就是来解决这个问题的。通过一个约定俗成的端口号,5353。(这个端口号应该是由IETF组织约定的。)每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的所有主机组播一个消息,我是谁,和我的IP地址是多少。然后其他也有该服务的主机就会响应,也会告诉你,它是谁,它的IP地址是多少。当然,具体实现要比这个复杂点。 比如,A主机进入局域网,开启了mDNS服务,并向mDNS服务注册一下信息:我提供FTP服务,我的IP是192.168.1.101,端口是21。当B主机进入局域网,并向B主机的mDNS服务请求,我要找局域网内FTP服务器,B主机的mDNS就会去局域网内向其他的mDNS询问,并且最终告诉你,有一个IP地址为192.168.1.101,端口号是21的主机,也就是A主机提供FTP服务,所以B主机就知道了A主机的IP地址和端口号了。 大概的原理就是这样子,mDNS提供的服务要远远多于这个,当然服务多但并不复杂。 在Apple 的设备上(电脑,笔记本,iphone,ipad等设备)都提供了这个服务。很多Linux设备也提供这个服务。Windows的设备可能没有提供,但是如果安装了iTunes之类的软件的话,也提供了这个服务。 这样就可以利用这个服务开发一些局域网内的自动发现,然后提供一些局域网内交互的应用了。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页