执行ipconfig /all获取主机所有网卡信息
并分析这些字符串,提取出有效网卡(网卡名称,mac地址,ipv4地址,掩码,网关,dns)
将网卡插入HashMap中,key是网卡的名称,value是网卡对象(包含mac和4个逻辑地址)
请输入网卡的名称,程序通过map的get方法取出此名称对应的网卡对象
根据网卡对象执行其方法getNetId()取出其网卡所在网络号进行打印
getBroadId()取出其广播号进行打印
2: 根据网卡的ip和掩码扫描所有这个子网中可能存在的邻居
然后用ping ..方式进行验证此邻居是否存在,如果存在则将其加入
网卡的邻居集合(HashSet)中
3: 某些邻居有可能开启防火墙导致ping失败,所以验证其是否存在的
恰当方式是先ping它一下,然后用arp -a查看这个邻居是否有arp回应
如果存在arp条目则说明这个邻居是存在的.

 package day2020072501;

 import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class Zzbds { public static String exeCmd(String commandStr) {
BufferedReader br = null;
try {
Process p = Runtime.getRuntime().exec(commandStr);
br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
// System.out.println(sb.toString());
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return commandStr;
} public static void main(String[] args) {
String str = exeCmd("ipconfig /all");
String expr = "(.+适配器 +.+)\\:"; // 找到所有网卡名字
HashMap<NetInfo, String> mp = new HashMap<>(); // HashMap存储信息 Pattern pt = Pattern.compile(expr); // 配对 P,和正则匹配
Matcher mt = pt.matcher(str); // 开始匹配源字符串 matcher
System.out.println("\n=========================="); int MacIndex = 0;// 记录网卡
while (mt.find()) {
MacIndex++;
System.out.println(mt.group(1));
}
System.out.println("\n共" + MacIndex + "个网卡");
if (MacIndex == 0) {
System.out.println("没有网卡");
return;
} System.out.println("\n=========================="); Matcher mt1 = pt.matcher(str); // 开始匹配源字符串 matcher
// System.out.println("可用网卡");
int MacUse = 0;// 可以使用的网卡数量
String[] MacArr = new String[10];// 存储网卡数组(可用网卡)
while (mt1.find()) { // 循环遍历所有网卡
// 判断是否可用
if (NetWorkUtil.NetWorkavailable(mt1.group())) {
MacArr[MacUse] = mt1.group();
MacUse++;
// System.out.println(mt1.group());
}
}
for (int i = 0; i < MacUse; i++) {
System.out.println(MacArr[i]);
}
System.out.println("\n可用网卡共:" + MacUse + "个");
System.out.println("\n==========================\n"); // System.out.println("------------------------------------");
// 打印出可用的网卡信息
for (int j = 0; j < MacUse; j++) { // 使用(数组)循环,打印所有可用网卡的所有信息
String MacInfo = "";// 可用的网卡信息
String expr1 = "(" + MacArr[j] + "([\\d\\D]*))";
System.out.println("\n第" + (j + 1) + "个是:" + MacArr[j]);
Pattern pt1 = Pattern.compile(expr1);
Matcher mt2 = pt1.matcher(str);
if (mt2.find()) {
MacInfo = mt2.group(1);// 把查到的信息赋给变量MaxInfo
}
// System.out.println(MacInfo);
System.out.println("---------------------可用网卡的具体信息如下(第" + (j + 1) + "个网卡)----------------");
Pattern pt2 = Pattern.compile(" +描述(\\. +)+: (.*)");
Matcher mt3 = pt2.matcher(MacInfo);// 网卡名
Pattern pt3 = Pattern.compile(" +物理地址(\\. +)+: (.*)");
Matcher mt4 = pt3.matcher(MacInfo);// 网卡地址
Pattern pt5 = Pattern.compile(" +IPv4 地址( +\\.)+ +: +(.*)\\(");
Matcher mt5 = pt5.matcher(MacInfo);// IP地址
Pattern pt6 = Pattern.compile(" +子网掩码( +\\.)+ +: +(.*)");
Matcher mt6 = pt6.matcher(MacInfo);// 子网掩码
Pattern pt7 = Pattern.compile(" +默认网关(\\. +)+: (.*)");
Matcher mt7 = pt7.matcher(MacInfo);// 网关
Pattern pt8 = Pattern.compile(" +DNS 服务器( +\\.)+ +: +(.*)");
Matcher mt8 = pt8.matcher(MacInfo);// DNS String MacName = "";
String MacIP = "";
String IPV4 = "";
String NetMask = "";
String GateWay = "";
String DNS = ""; if (mt3.find() && mt4.find() && mt5.find() && mt6.find() && mt7.find() && mt8.find()) {
MacName = mt3.group(2);
MacIP = mt4.group(2);
IPV4 = mt5.group(2);
NetMask = mt6.group(2);
GateWay = mt7.group(2);
DNS = mt8.group(2);
mp.put(new NetInfo(MacName,MacIP, IPV4, NetMask, GateWay, DNS), MacName);
}
System.out.println("网卡名称:" + MacName.trim());
System.out.println("网卡地址:" + MacIP.trim());
System.out.println("IPV4地址:" + IPV4.trim());
System.out.println("子网掩码:" + NetMask.trim());
System.out.println("默认网关:" + GateWay.trim());
System.out.println("DNS地址:" + DNS.trim()); } System.out.println("\n=====================使用HashMap遍历输出===========================");
for (NetInfo h : mp.keySet()) {
System.out.println("\n网卡名字:" + mp.get(h) + "\n" + h);
System.out.println("\n-------------");
} System.out.println("======================");
System.out.println("请输入网卡名:");
//String inputMacName = new Scanner(System.in).next();//输入网卡名称
//默认输入:VMware Virtual Ethernet Adapter for VMnet8 String NetId = "";//记录IP
String inputMacName ="VMware Virtual Ethernet Adapter for VMnet8";
System.out.println("您输入的是:"+inputMacName);
for (NetInfo h : mp.keySet()) {
if((h.getMacName().trim()).equals(inputMacName)){
System.out.println("\n网卡名字:" + mp.get(h) + "\n" + h);
NetId = h.getIPV4();
System.out.println("\nIP:"+NetId); //打印出此IP(后面求出网络号、广播号)
}
} //分解数组
String []netIPArr = NetId.split("\\.");
for(int i= 0;i<netIPArr.length;i++){
System.out.println(netIPArr[i]);
} //求网络号:
System.out.println("网络号:"+netIPArr[0]+"."+netIPArr[1]+"."+netIPArr[2]+"."+0);
System.out.println("广播号:"+netIPArr[0]+"."+netIPArr[1]+"."+netIPArr[2]+"."+255); //访问所有邻居
HashSet<String> nei = new HashSet<>();//存储所有可达的邻居
for(int i= 1;i<5;i++){
String str1 = exeCmd("ping "+netIPArr[0]+"."+netIPArr[1]+"."+netIPArr[2]+"."+i);
System.out.println(str1);
//判断是否Ping 通
Pattern pt9 = Pattern.compile("TTL");
Matcher mt9 = pt9.matcher(str1);
if (mt9.find()){//如果能ping 通,直接加入到set集合内
//System.out.println(netIPArr[0]+"."+netIPArr[1]+"."+netIPArr[2]+"."+i);
nei.add(netIPArr[0]+"."+netIPArr[1]+"."+netIPArr[2]+"."+i);//存储
}else{//如果ping 不同,使用arp 查看回应
String str2 = exeCmd("arp -a");
Pattern pt10 = Pattern.compile(netIPArr[0]+"."+netIPArr[1]+"."+netIPArr[2]+"."+i);
Matcher mt10 = pt10.matcher(str2);
if (mt10.find()){//如果arp 返回数据,也加入到set集合内
nei.add(netIPArr[0]+"."+netIPArr[1]+"."+netIPArr[2]+"."+i);//存储
}
}
} //输出所有可达的邻居
System.out.println("所有可达的邻居:");
for(String s : nei){
System.out.println(s);
} }
}

Java实现获取命令行中获取指定数据的更多相关文章

  1. Java实现获取命令行中的指定数据

    构造一个ping的命令类这个类中可以设置需要ping的目标域名类提供方法public void exec();方法执行完毕后可以读取ping的次数,ping的成功回应包个数ping的丢包个数,ping ...

  2. Oracle中使用游标获取指定数据表的所有字段名对应的字符串

    操作步骤:打开PLSQL Developer后,直接执行下面的语句就可以出来 --Oracle中使用游标获取指定数据表的所有字段名对应的字符串 declare mytablename VARCHAR( ...

  3. 通过DialogFragment从DatePicker或TimePicker中获取日期数据

    通过DialogFragment从DatePicker或TimePicker中获取日期数据 一个activity类,里面存有date和time的变量,想通过dialogfragment的方式获取用户输 ...

  4. Java-Runoob-高级教程-实例-数组:14. Java 实例 – 在数组中查找指定元素

    ylbtech-Java-Runoob-高级教程-实例-数组:14. Java 实例 – 在数组中查找指定元素 1.返回顶部 1. Java 实例 - 在数组中查找指定元素  Java 实例 以下实例 ...

  5. java 从spring容器中获取注入的bean对象

      java 从spring容器中获取注入的bean对象 CreateTime--2018年6月1日10点22分 Author:Marydon 1.使用场景 控制层调用业务层时,控制层需要拿到业务层在 ...

  6. java实现从报文中获取投保单号

    java实现从报文中获取投保单号 投保单号正则表达式: String regex = "<proposalNo>([0-9]+)</proposalNo>[\\s\\ ...

  7. java增强for循环中获取index

    java增强for循环中获取index http://rensanning.iteye.com/blog/2003205

  8. 【Java EE 学习 78 中】【数据采集系统第十天】【Spring远程调用】

    一.远程调用概述 1.远程调用的定义 在一个程序中就像调用本地中的方法一样调用另外一个远程程序中的方法,但是整个过程对本地完全透明,这就是远程调用.spring已经能够非常成熟的完成该项功能了. 2. ...

  9. 从UEditor内容中获取指定节点值(转)

    今天吐槽一下百度的富文本编辑器UEditor,这种富文本编辑器极大地方便我们上传文件,开发人员无需编写任何上传代码,只需配置几个路径即可.但高度集成的东西有时也显得笨重,灵活度不高.比如:编辑器中我既 ...

随机推荐

  1. [POJ3783]Balls 题解

    题目大意 鹰蛋问题.$ n\(个蛋,\)m\(层楼. 存在一层楼\)E\(,使得\)E\(以及\)E\(以下的楼层鹰蛋都不会摔碎,问最坏情况下最少多少次能够知道\)E$. 非常经典的模型,初看题目根本 ...

  2. Linux探测工具BCC(可观测性)

    BCC(可观测性) 目录 BCC(可观测性) 简介 动机 版本要求 安装 安装依赖 安装和编译LLVM 安装和编译BCC windows源码查看 BCC的基本使用 工具讲解 execsnoop ope ...

  3. 【Redis】Redis开篇与如何安装单机版Redis,这次我会了!!

    写在前面 很早之前,就有不少小伙伴微信留言说:冰河,你能不能写一个Redis专栏啊,我最近在学习Redis,看书看不下去,学习视频又觉得视频太长了,还是看你的文章比较给力!哈哈,原来我写的文章能够让小 ...

  4. C#LeetCode刷题之#141-环形链表(Linked List Cycle)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3901 访问. 给定一个链表,判断链表中是否有环. 进阶: 你能否 ...

  5. 在K3s上使用Kong网关插件,开启K3s的无限可能!

    我的工作中很重要的一部分是参加各种各样的技术会议.最近参加的是去年11月的北美KubeCon,在会议的最后一天,所有人都焦头烂额,我也一直机械地向不同的人重复我的自我介绍.后来,我已经十分烦躁,决定逃 ...

  6. 如何将返回的JSon字符串用MAP格式读取

    语法是这样: ObjectMapper mapper = new ObjectMapper(); Map resultMap=null; resultMap = mapper.readValue(in ...

  7. python爬虫抖音 个人资料 仅供学习参考 切勿用于商业

    本文仅供学习参考 切勿用于商业 本次爬取使用fiddler+模拟器(下载抖音APP)+pycharm 1. 下载最新版本的fiddler(自行百度下载),以及相关配置 1.1.依次点击,菜单栏-Too ...

  8. Python-Opencv 图像处理基本操作

    Python-Opencv 图像处理基本操作 1.图像读取 使用cv2.imread(filepath,flags)读入图像 filepath: 读入图像完整路径(绝对路径,相对路径) flags: ...

  9. nohup 命令的使用

    nohup 命令的使用 1. nohup简介 nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所有挂断(SIGHUP)信号.在注销后使用 nohup 命令运行后台中的 ...

  10. echarts 导出为word文档

    https://www.jianshu.com/p/5bd47ab59bbe 主要思路:前台echarts生成图片后,获取base64码,传给后台解析,然后写入freemarker模板,进行下载. 图 ...