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
java获取来访者mac信息的更多相关文章
- java获取当前操作系统的信息
java获取当前操作系统的信息 JavaOS虚拟机UnixEXT 从网上收集的一些关于java获取操作系统信息的方法,现在总结一下: 1获取本机的IP地址: private static Strin ...
- java获取天气预报的信息
运行效果: 主要功能: 1,jsp页面输入省份和城市 根据条件获取当地的天气信息 2,java代码 利用第三方的省份和城市的路径地址 本工程主要实现java获取天气预报的信息步骤1,创建工程weath ...
- java 获取本地 mac 地址
主要参考:Java获取本机MAC地址/IP地址/主机名 做的更改: 1.我的windows是中文版,程序中获取mac时是按照physical address 获取的,添加上"物理地址&quo ...
- Java 获取到配置文件信息
Java程序将数据库或者服务器IP写入到代码中,难免缺少灵活性. 如果写入到配置文件,部署到不通服务器上,只需要修改配置文 件即可. Java怎么读取配置文件 /** * 获取到配置文件信息 * @p ...
- Java 获取所有子类信息
我以前的博客(Java Scala获取注解的类信息)介绍过通过Reflections工具通过使用特定注解的类的信息,其实本工具也可以获取接口,抽象类,类等的所有子类信息.使用方法如下: Reflect ...
- Java获取电脑硬件信息
package com.szht.gpy.util; import java.applet.Applet; import java.awt.Graphics; import java.io.Buffe ...
- java获取类的信息
关键技术剖析 1.java.lang.reflect包实现了java的反射机制,在使用反射机制时,需要导入该包. 2.Class类的forName方法能够根据类名加载类,获得类的Class对象. Cl ...
- java获取操作系统的MAC地址和硬盘序列号
1.判断操作系统是Windows还是Linux private static Boolean isLinux() { String os = System.getProperty("os.n ...
- java获取电脑mac物理地址
import java.net.InetAddress;import java.net.NetworkInterface;import java.net.SocketException;import ...
随机推荐
- js之运算符(关系运算符)
关系运算符用于测试两个值之间的关系,根据关系是否存在而返回true或者是false.关系表达式总是返回一个布尔值. 具有如下8个关系运算符:大于(>),小于(<),小于等于(<=), ...
- 可能是全网最全的http面试答案
HTTP有哪些方法? HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法 HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNE ...
- SSIS 初次接触 + 开发记录
第一次接触SSIS,昨天终于把一套流程走通,记一下流水. 1:安装 使用SSIS需要安装插件(VS 和Sql Server都需要另外安装). 自己使用的vs2017开发,官网有专门的 VS2017 安 ...
- ConfigurableApplicationContext
转自:https://blog.csdn.net/weixin_39165515/article/details/77169231 此接口结合了所有ApplicationContext需要实现的接口. ...
- 阿里云linux配置ftp服务
阿里云linux配置ftp服务 一.ftp服务安装 运行以下命令安装ftp yum install -y vsftpd 运行以下命令打开及查看etc/vsftpd cd /etc/vsftpd ls ...
- vue+ckEditor5
1.安装依赖 "@ckeditor/ckeditor5-build-balloon": "^10.1.0", "@ckeditor/ckeditor5 ...
- Redis日志级别
Redis默认的设置为verbose,开发测试阶段可以用debug,生产模式一般选用notice 1. debug:会打印出很多信息,适用于开发和测试阶段 2. verbose(冗长的):包含很多不太 ...
- fragment初步认识
- 系列文章--Python Web编程
我从网上找到了其他园友的文章,很不错,留着自己学习学习. Python Web编程(一)Python Web编程(二)Python Web编程(三)Python Web编程(四)Python Web编 ...
- WPF界面开发必备技能!TreeListView - 如何快速更新多个项目属性
DevExpress广泛应用于ECM企业内容管理. 成本管控.进程监督.生产调度,在企业/政务信息化管理中占据一席重要之地.通过DevExpress WPF Controls,您能创建有着强大互动功能 ...