根据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

java获取来访者mac信息的更多相关文章

  1. java获取当前操作系统的信息

    java获取当前操作系统的信息 JavaOS虚拟机UnixEXT  从网上收集的一些关于java获取操作系统信息的方法,现在总结一下: 1获取本机的IP地址: private static Strin ...

  2. java获取天气预报的信息

    运行效果: 主要功能: 1,jsp页面输入省份和城市 根据条件获取当地的天气信息 2,java代码 利用第三方的省份和城市的路径地址 本工程主要实现java获取天气预报的信息步骤1,创建工程weath ...

  3. java 获取本地 mac 地址

    主要参考:Java获取本机MAC地址/IP地址/主机名 做的更改: 1.我的windows是中文版,程序中获取mac时是按照physical address 获取的,添加上"物理地址&quo ...

  4. Java 获取到配置文件信息

    Java程序将数据库或者服务器IP写入到代码中,难免缺少灵活性. 如果写入到配置文件,部署到不通服务器上,只需要修改配置文 件即可. Java怎么读取配置文件 /** * 获取到配置文件信息 * @p ...

  5. Java 获取所有子类信息

    我以前的博客(Java Scala获取注解的类信息)介绍过通过Reflections工具通过使用特定注解的类的信息,其实本工具也可以获取接口,抽象类,类等的所有子类信息.使用方法如下: Reflect ...

  6. Java获取电脑硬件信息

    package com.szht.gpy.util; import java.applet.Applet; import java.awt.Graphics; import java.io.Buffe ...

  7. java获取类的信息

    关键技术剖析 1.java.lang.reflect包实现了java的反射机制,在使用反射机制时,需要导入该包. 2.Class类的forName方法能够根据类名加载类,获得类的Class对象. Cl ...

  8. java获取操作系统的MAC地址和硬盘序列号

    1.判断操作系统是Windows还是Linux private static Boolean isLinux() { String os = System.getProperty("os.n ...

  9. java获取电脑mac物理地址

    import java.net.InetAddress;import java.net.NetworkInterface;import java.net.SocketException;import ...

随机推荐

  1. 转:idea类名出现了不同的颜色

    转:https://blog.csdn.net/yf_mood/article/details/88191818 在安装了git以后发现idea类名出现了不同的颜色,如下: 它们分别表示的含义: 绿色 ...

  2. C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能

    本文通过ANTS Memory Profiler工具探索c#中+.string.Concat.string.Format.StringBuilder.Append四种方式进行字符串拼接时的性能. 本文 ...

  3. NFS +inotify+rsync 实现数据的远程挂载与实时增量备份

    NFS 网络文件系统 功能: 用户可以像访问自己的本地文件系统一样使用网络中的远端系统上的文件 原理: 用户进程-->RPC服务(portman)-->tcp/ip协议栈-->远端主 ...

  4. BLE 5协议栈-属性协议层(ATT)

    文章转载自:http://www.sunyouqun.com/2017/04/page/2/ 属性协议(Attribute Protocol)简称ATT. ATT层定义了属性实体的概念,包括UUID. ...

  5. 基于docker安装pxc集群

    基于docker安装pxc集群 一.PXC 集群的安装 PXC集群比较特殊,需要安装在 linux 或 Docker 之上.这里使用 Docker进行安装! Docker的镜像仓库中包含了 PXC数据 ...

  6. Centos7下rc.local文件开机不执行…

    在Centos7下,rc.local文件,开机默认是不执行的 /etc/rc.local链接的是  /etc/rc.d/rc.local文件,该文件默认不开机启动,官方建议添加一个service来实现 ...

  7. 一文透彻掌握 Python 编码问题

    一.当我说字符时,我在说什么? 当我们提起字符串时,每个程序员都能理解到,我们说的是一个字符序列.但是,当我们说字符时,很多人就困惑了. 写在纸上的字符很容易辨识,但是为了将不同的字符在计算机中标识出 ...

  8. Linux系统用户权限管理

    Linux系统中三种基本权限 用户属主.用户属组及其它人权限 -rw-r--r-- 1 root root 762 11-11 20:34 a.out 文件类型 ls命令中的缩写 应用 一般文件 - ...

  9. Hive中将文件加载到数据库表失败解决办法

    Hive中将文件加载到数据库表失败解决办法(hive创建表失败) 遇到的问题: FAILED: Execution Error, return code 1 from org.apache.hadoo ...

  10. Python入门-2编程基本概念:03引用的本质-栈内存和堆内存-内存示意图

    引用 在Python中,变量也称为:对象的引用.因为,变量存储的就是对象的地址. 变量通过地址引用了“对象”. 变量位于:栈内存(压栈出栈等细节,后续再介绍). 对象位于:堆内存. Python是动态 ...