Java如何在命令行中获取指定数据

 更新时间:2020年07月30日 08:57:26   作者:勤快的懒羊羊  
这篇文章主要介绍了Java如何在命令行中获取指定数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1.执行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);
    }

  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • MybatisPlus分页查询与多条件查询介绍及查询过程中空值问题的解决

    MybatisPlus分页查询与多条件查询介绍及查询过程中空值问题的解决

    mybatisplus是个很好用的插件,相信小伙伴们都知道,下面这篇文章主要给大家介绍了关于mybatis-plus实现分页查询与多条件查询介绍及查询过程中空值问题的相关资料,需要的朋友可以参考下
    2022-10-10
  • Java日常练习题,每天进步一点点(40)

    Java日常练习题,每天进步一点点(40)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • Android开发Activity管理工具类的操作方法

    Android开发Activity管理工具类的操作方法

    这篇文章主要介绍了Android开发Activity管理工具类,下面是一个完整的Activity管理工具类实现,可以帮助你管理应用中的所有Activity,方便一键退出应用、获取当前Activity等操作,需要的朋友可以参考下
    2021-02-02
  • 什么是RESTful API,有什么作用

    什么是RESTful API,有什么作用

    提到RESTful API大家势必或多或少听说过,但是什么是RESTful API ?如何理解RESTful API 呢?今天咱们就来聊聊这个RESTful API
    2023-11-11
  • 深入学习java8 中的CompletableFuture

    深入学习java8 中的CompletableFuture

    本文主要介绍了java8中的CompletableFuture,CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步回调、流式处理、多个Future组合处理的能力,使Java在处理多任务的协同工作时更加顺畅便利,下文需要的朋友可以参考一下
    2022-05-05
  • Java实现List去重的几种方法总结

    Java实现List去重的几种方法总结

    这篇文章主要为大家详细介绍了Java中List去重的几种常用方法总结,文中的示例代码讲解详细,具有一定的学习和参考价值,需要的小伙伴可以了解一下
    2023-09-09
  • Java实现扑克牌洗牌和发牌

    Java实现扑克牌洗牌和发牌

    这篇文章主要为大家详细介绍了Java实现扑克牌洗牌和发牌,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • Logger.error打印错误异常的详细堆栈信息

    Logger.error打印错误异常的详细堆栈信息

    这篇文章主要介绍了Logger.error打印错误异常的详细堆栈信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • springboot整合netty框架的方式小结

    springboot整合netty框架的方式小结

    Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,这篇文章主要介绍了springboot整合netty框架的方式小结,需要的朋友可以参考下
    2022-06-06
  • java项目中classpath指向哪里

    java项目中classpath指向哪里

    这篇文章介绍了java项目中classpath指向哪里及工作原理,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12

最新评论