java获取来访者mac信息

根据IP获取对应的Mac地址,支持win10+Linux
package com.simonjia.util.other;

/**
 * @Author: SimonHu
 * @Date: 2019/6/13 11:03
 * @Description:
 */
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MacAddress {
    
    /**
     * 调用命令
     * @param cmd
     * @return
     */
    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, String sourceString, final String macSeparator) {
        String result = "";
        int index = sourceString.indexOf(ip);
        if (index == -1) {
            index = 0;
        }
        sourceString = sourceString.substring(index, sourceString.length() - 1);
        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(MacAddress.getMacAddress("222.129.19.10"));
    }
}
获取同一局域网内的所有IP和对应的Mac
package com.simonjia.util.other;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 获取同一局域网内的所有IP和对应的Mac
 * @author liuyazhuang
 *
 */
public class AllAddress {
    
    /**
     * 获取统一局域网的所有IP地址
     * @return 所有IP地址的List集合
     */
    public static List<String> getIPs() {
        List<String> list = new ArrayList<String>();
        Runtime r = Runtime.getRuntime();
        Process p;
        try {
            p = r.exec("arp -a");
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String inline;
            while ((inline = br.readLine()) != null) {
                if(!"".equals(inline.trim())){
                    if (inline.indexOf("---") > -1) {
                        continue;
                    }
                    if(inline.indexOf("Internet") > -1){
                        continue;
                    }
                    // 有效IP
                    String[] str = inline.split(" {4}");
                    list.add(str[0]);
//                    System.out.println(inline);
                }
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }
    
    /**
     * 获取同一局域网内的IP和Mac
     * @return 以IP地址为Key, Mac地址为Value的Map
     */
    public static Map<String, String> getAllIPAndMac(){
        Map<String,String> map = new HashMap<String,String>();
        Runtime r = Runtime.getRuntime();
        Process p;
        try {
            p = r.exec("arp -a");
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String inline;
            while ((inline = br.readLine()) != null) {
                if(!"".equals(inline.trim())){
                    if (inline.indexOf("---") > -1) {
                        continue;
                    }
                    if(inline.indexOf("Internet") > -1){
                        continue;
                    }
                    // 有效IP
                    String[] arr = inline.split(" {4}");
                    String ip = arr[0].trim();
                    String mac = "00-00-00-00-00-00";
                    for(int i = 1; i < arr.length; i ++){
                        String str = arr[i].trim();
                        if(stringIsMac(str)){
                            mac = str;
                            break;
                        }
                    }
                    map.put(ip, mac);
                }
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return map;
    }
    
    /**
     * 根据正则表达式判断是否为Mac地址
     * @param val
     * @return true:是Mac地址,false:不是Mac地址
     */
    private static boolean stringIsMac(String val) {
        String trueMacAddress = "^([0-9a-fA-F]{2})(([/\\s:-][0-9a-fA-F]{2}){5})$";
        // 这是真正的MAC地址;正则表达式;
        return val.matches(trueMacAddress);
    }
    
    /**
     * 根据IP提取主机名
     * @param ips
     * @return 以IP地址为Key,主机名为Value的Map
     */
    public static Map<String, String> getHostnames(List<String> ips){
        Map<String,String> map = new HashMap<String,String>();
        System.out.println("正在提取hostname...");
        for(String ip : ips){
            String command = "ping -a " + ip;
            Runtime r = Runtime.getRuntime();
            Process p;
            try {
                p = r.exec(command);
                BufferedReader br = new BufferedReader(new InputStreamReader(p .getInputStream()));
                String inline;
                while ((inline = br.readLine()) != null) {
                    if(inline.indexOf("[") > -1){
                        int start = inline.indexOf("Ping ");
                        int end = inline.indexOf("[");
                        String hostname = inline.substring(start+"Ping ".length(),end-1);
                        System.out.println(hostname);
                        map.put(ip,hostname);
                    }
                }
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("提取结束!");
        return map;
    }
    
    public static void main(String[] args) {
        System.out.println(getIPs());
        System.out.println(getAllIPAndMac());
    }
}

参考:https://blog.csdn.net/l1028386804/article/details/46049885

posted @ 2019-06-13 11:16  748573200000  阅读(1188)  评论(0编辑  收藏  举报