Java + Jpcap实现监控 IP包流量

这篇具有很好参考价值的文章主要介绍了Java + Jpcap实现监控 IP包流量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java + Jpcap实现监控 IP包流量

说明:本设计是计算机网络课程的课设,因为代码是提前实现的,本博客于后期补上,又因为代码没写注释自己也看不懂了,所以,仅供参考,就当提供一种实现方式。

文中提供的《Jpcap中文API文档》来源于网络,本文仅用于学习交流,如有侵权,可联系我进行删除。

效果图:

Java + Jpcap实现监控 IP包流量

1)课程设计要求

1.1 课程设计目的

通过本实课程设计,有助于理解 IP包的格式和加深对 IP 协议的理解。

1.2 课程设计要求

编制程序,监控网络,捕获一段时间内网络上的 IP 数据包,按 IP 数据包的源地址统计出该源地址在该时间段内发出的 IP 包的个数,将其写人日志文件中或用图形表示出来(建议用图形表示出统计结果)。

1.3 程序的具体要求如下

用命令行运行: IPStatistic time logfile

其中, IPStatistic 是程序名; time 是设定的统计时间间隔(单位为分钟,比如,2表示2分钟); logfile 表示统计结果写人的日志文件名(若用图形表示统计结果则可以不选这个参数)。

2)编码前的准备

2.1 技术点

后端:springboot,Jpcap

前端:vue2,ECharts

说明:Jpcap是一个能够捕获、发送网络数据包的java类库包。

2.2 环境搭建

2.2.1 事先说明和下载链接

ps:网上大部分都是Jpcap+winpcap,但是winpcap太老了,大概率在Windows10和Windows11上会出问题,当时也踩了不少坑,这里推荐使用npcap

winocap网址:https://www.winpcap.org/

Npcap网址:https://npcap.com/

从图中可以看出,winocap已经不再支持,推荐使用npcap

Java + Jpcap实现监控 IP包流量

进入Npcap官网下载即可

Java + Jpcap实现监控 IP包流量

2.2.2 资源下载

链接:https://pan.baidu.com/s/1y6u-V-FPwOgIxC9ZoAD7yg
提取码:1111

内容:

  • Jpcap中文API文档
  • npcap-1.72.exe
  • Jpcap.dll
  • jpcap.jar
  • network_vue(前端代码,需要自己装包:npm install
  • network_course_design(Java代码)

2.2.3安装

重点1、3、4步

  1. Npcap.exe正常进行安装即可

  2. 创建一个普通springboot项目

  3. 在项目中导入Jpcap.jar

Java + Jpcap实现监控 IP包流量

  1. Jpcap.dll放到JDK安装路径下的 /jre/bin 目录下(我这里好像没有放也可以运行,可以试一下)

  2. 前端就是一个普普通通的VUE+ECharts项目

3)编码

重要提示:当时为了赶工,其中的逻辑很有问题,现在的评价就一个字,烂,非常烂!!!看看关键实现就行。

这里推荐看这篇博客,写的很好,里面对重要字段进行了说明:https://www.cnblogs.com/shy-huiying/p/5636274.html

3.1 后端实现

3.1.1 获得本机所有网卡接口信息

Jpcap提供了方法JpcapCaptor.getDeviceList()完成这个任务,该方法返回一组NetworkInterface对象。

NetworkInterface[] devices = JpcapCaptor.getDeviceList();

/**
*  这里是controller层
 * 获得所有网卡接口
 * @return List<String>
 */
@RequestMapping("/info")
public Object getNetworkCard(){
    // 获取网络接口列表,返回所有的网络设备数组;
    NetworkInterface[] devices = JpcapCaptor.getDeviceList();
    if (devices.length == 0) {
        return "无网卡信息";
    }else{
        List<NetworkCardPojo> netList = new ArrayList<>();
        int index = 0;
        for (NetworkInterface n : devices) {
            //NetworkCardPojo是自己编写的实体类,包含网卡接口索引和网卡接口名两个属性
            NetworkCardPojo networkCardPojo = new NetworkCardPojo();
            networkCardPojo.setIndex(index++);
            networkCardPojo.setDescription(n.description);
            //networkCardPojo.setNetworkInterface(n);
            netList.add(networkCardPojo);
        }
        return netList;
    }
}
public class NetworkCardPojo {
    private Integer index;
    private String description;
    //private NetworkInterface NetworkInterface;
}

返回到前端的数据:

Java + Jpcap实现监控 IP包流量

3.1.2 得到指定网卡的具体信息

  • NetworkInterface[] devices = JpcapCaptor.getDeviceList();得到多有网卡信息
  • devices[index].addresses;根据前端传入的网卡接口索引得到指定网卡接口的信息。
   /**
   	 *  这里是controller层
     *  打印选择网卡的IP地址和子网掩码;
     * @param index
     * @return
     */
    @RequestMapping("/local")
    public LocalParameterPojo getLocalParameter(@ProbeParam("index") Integer index){	
        NetworkInterface[] devices = JpcapCaptor.getDeviceList();
        //根据传入的网卡索引获取该网卡接口所属的IP地址
        NetworkInterfaceAddress[] device = devices[index].addresses;
        //LocalParameterPojo是自己编写的实体类,包含本机IP地址、子网掩码、网络连接类型
        LocalParameterPojo local = new LocalParameterPojo();
        if (device.length>0){
            local.setIpv4(device[0].address);
            local.setSubnetMask(device[0].subnet);
            local.setNetType(devices[0].datalink_description);
        }else {
            local.setNetType("该网卡接口不可用,请尝试切换其他网卡接口!");
        }
        return local;
    }

LocalParameterPojo实体类,注意部分字段是InetAddress类型

public class LocalParameterPojo {
    private InetAddress ipv4;            //本机IP地址
    private InetAddress SubnetMask;      //子网掩码
    private String netType;         //网络连接类型
}

Java + Jpcap实现监控 IP包流量

3.1.3 监控ip包数据

因为一个ip地址会发送多个ip包,这里主要是将ip包进行分组统计:

IP地址--累计IP包数量--累计IP包大小

这里写的不好,有些问题,甚至问题很大,后面想到有更好的解决方法,但是没有尝试过,就不写了

    /**
     * 这里是controller层
     * 开启监控ip包流量监控
     * @param index
     * @return
     */
    @RequestMapping("/start")
    public List<TargetParameterPojo> startGetPacket(@ProbeParam("index") Integer index){
        targetParameter.startThread(index);
        //根据Ip地址分组
        Map<InetAddress, IpGroup> mapAll = new HashMap<>();
        System.out.println("ip count:"+targetParameter.getTargetMap().size());
        for (int i=0;i<targetParameter.getTargetMap().size();i++){
            IpGroup ipGroup = new IpGroup();
            for (InetAddress key:targetParameter.getTargetMap().get(i).keySet()){
                Integer size = targetParameter.getTargetMap().get(i).get(key);
                int count=1;
                //检查 hashMap 中是否存在指定的 key 对应的映射关系。
                if(mapAll.containsKey(key)){
                    Integer tempSize = mapAll.get(key).getSize();
                    size += tempSize;
                    Integer tempCount = mapAll.get(key).getCount();
                    count += tempCount;
                }
                ipGroup.setCount(count);
                ipGroup.setSize(size);
                mapAll.put(key,ipGroup);
            }
        }
        // 将数据装到TargetParameterPojo
        List<TargetParameterPojo> targetList = new ArrayList<>();
        for (Map.Entry<InetAddress,IpGroup> map:mapAll.entrySet()){
            TargetParameterPojo targetPojo = new TargetParameterPojo();
            targetPojo.setSourceIp(map.getKey());
            targetPojo.setSize(map.getValue().getSize());
            targetPojo.setCount(map.getValue().getCount());
            targetList.add(targetPojo);
        }
        return targetList;
    }

    /**
     * 关闭监控ip包流量
     * @return
     */
    @RequestMapping("/stop")
    public int stopsGetPacket(){
        int flag = targetParameter.getTargetMap().size();
        if(flag>1){
            targetParameter.stopThread();
            return 1;
        }else {
            return 0;
        }
    }

service层

@Service
public class TargetParameter implements Runnable{
    //数据统计要用到的list
    private static List<Map<InetAddress,Integer>> targetMap = new ArrayList<>();
    private boolean flag = true;
    private TargetParameter tp;
    private Thread thread;
    private Integer isOff=0;

    public TargetParameter(JpcapCaptor jpcap) {
        this.jpcap = jpcap;
    }

    private JpcapCaptor jpcap = null;

    public TargetParameter() {
    }

    public List<Map<InetAddress, Integer>> getTargetMap() {
        return targetMap;
    }

    @Override
    public void run() {
        //只要不停止就一直进行抓包
        while (flag){
            IPPacket ipPacket = (IPPacket) jpcap.getPacket();
            if (ipPacket!=null){
                Map<InetAddress,Integer> map = new HashMap<>();
                map.put(ipPacket.src_ip,ipPacket.len);
                targetMap.add(map);
            }
            // 回调方法
            //jpcap.processPacket(-1, new CallbackService());
        }
    }
    /**
     * 开启线程方法
     */
    public void startThread(Integer index){
        if (isOff==0){
            try {
                NetworkInterface[] devices = JpcapCaptor.getDeviceList();
                //获得了JpcapCaptor实例就可以用来捕获来自网络接口的数据包。
                //网卡索引,捕获数据包大小,是否开启混杂模式(混杂模式会捕获到数据表),超时
                jpcap = JpcapCaptor.openDevice(devices[index], 1024, true, 1000);
                // 在捕获前先设置过滤;
                jpcap.setFilter("ip", true);
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("抓取数据包时出现异常!!");
            }
            tp = new TargetParameter(jpcap);
            //创建一个抓抓包线程,保证一直进行抓包
            thread = new Thread(tp);
            thread.start();
            System.out.println("thread.getName():"+thread.getName());
            isOff++;
        }
    }

    /**
     * 关闭线程并清空List
     */
    public void stopThread(){
        isOff=0;
        tp.flag=false;
        targetMap.clear();
        System.out.println(targetMap);
    }
}

Pojo:

public class TargetParameterPojo {
    private InetAddress sourceIp;
    private Integer count;
    private Integer size;
}
public class IpGroup {
    private Integer size;
    private Integer count;
}

Java + Jpcap实现监控 IP包流量

3.1.4 目录结构

Java + Jpcap实现监控 IP包流量

3.2 前端实现

前端实现很简单,主要是数据渲染,这里说一下我的思路:

  1. 设定一个计时器,每隔1秒钟就请求一次数据,从而进行数据更新(axios实现)
  2. 可根据需要对数据进行排序和截取,比如截取前20条数据进行排序(数据条数太多会造成图形不美观)
  3. 优化:对开启和关闭按钮进行控制,防止重复请求和重复关闭

4)END

资源下载

链接:https://pan.baidu.com/s/1y6u-V-FPwOgIxC9ZoAD7yg
提取码:1111

内容:

  • Jpcap中文API文档
  • npcap-1.72.exe
  • Jpcap.dll
  • jpcap.jar
  • network_vue(前端代码,需要自己装包:npm install
  • network_course_design(Java代码)

重要:请勿学习如上代码的写法,那时候vue正在学,还行学完,代码冗余严重。

本博客仅仅提供解决方法!欢迎讨论,感谢批评指正。文章来源地址https://www.toymoban.com/news/detail-413508.html

到了这里,关于Java + Jpcap实现监控 IP包流量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 应用流量监控实践

    得物Apm系统本身包含网络接口性能监控的能力,但接口监控主要关注的是接口的耗时、异常率等信息,没有流量消耗相关维度的统计信息,并且一部分流量消耗可能来自于音视频等其他特殊场景,在接口监控的盲区外。 为了了解用户目前使用App时的流量消耗情况,并支持分析

    2024年01月23日
    浏览(38)
  • Windows网络流量监控工具整理

    NetSpeedMonitor【国外】是Windows任务栏的轻量级网络监视工具栏。 只能监测实时网速和总流量。 只能运行在 Windows XP,Windows Server 2003,Windows Vista或Windows 7的计算机上。 监控TCP / UDP端点的连接表和带有简短流量概述 地址:https://web.archive.org/web/20140614061956/http://www.floriangilles.com:

    2024年02月05日
    浏览(55)
  • AWS / VPC 云流量监控

    由于安全性、数据现代化、增长、灵活性和成本等原因促使更多企业迁移到云,将数据存储在本地的组织正在使用云来存储其重要数据。亚马逊网络服务(AWS)仍然是最受追捧和需求的服务之一,而亚马逊虚拟私有云(VPC)在拥有大部分数据在本地的用户中越来越受欢迎。

    2024年02月15日
    浏览(36)
  • Nginx常用内置模块, 实现目录索引+状态监控+IP访问控制+用户访问控制

    1.安装nginx 2.配置nginx扩展配置文件,实现自定义网页根目录 3.配置autoindex自动索引模块 4.配置nginx状态监控模块 5.配置nginx基于IP访问控制access模块 6.配置nginx基于用户访问控制auth模块 1.挂载光盘,进入nginx软件包目录 umount /dev/cdrom /mnt eject mount /dev/cdrom /mnt cd /mnt/nginx-rpm/ 2.使用

    2024年01月21日
    浏览(54)
  • Linux 网络流量监控利器 iftop命令详解及实战

    简介 iftop 是什么 在 Linux 系统下即时监控服务器的网络带宽使用情况,有很多工具,比如 iptraf、nethogs 等等,但是推荐使用小巧但功能很强大的 iftop 工具。 iftop 是 Linux 系统一个免费的网卡实时流量监控工具,类似于 top 命令。iftop 可以监控指定网卡的实时流量、端口连接信

    2024年02月03日
    浏览(53)
  • SDN实验---Ryu的应用开发(二)流量监控

            掌握基于Ryu开发流量监控应用: 主动下发逻辑    (一)流量监控原理         代码讲解:         (一)开启Ryu         (二)开启Mininet          (三)Ryu显示结果    

    2024年02月11日
    浏览(50)
  • 无人机监控交通流量实时传输路况智慧交通系统说明

    “现在五星花园环岛通行状况良好,涪江路双向的通行状况也未出现拥堵,接送考生的车辆可以畅通行驶……”昨日上午 8 点 20 分,FM91.5南充交通音乐广播首次启用遥控无人飞行器服务考生。对市区易堵路段,特别是一些重点考点进行灵活监拍,以便更加直观地监控车辆,以

    2024年02月01日
    浏览(48)
  • SNMP协议详细介绍及SNMP监控LXD端口流量

    1.1 SNMP原理 网络设备越来越多,网络规模越来越大,管理这些设备也越来越重要。远程管理网络的需求日益迫切, SNMP 应运而生。 SNMP 即\\\"简单网络管理协议\\\",用于网络管理的协议,用于网络设备的管理。 SNMP 被设计为工作在 TCP/IP 协议族上, SNMP 基于 TCP/IP 协议工作,对网络

    2024年01月19日
    浏览(47)
  • 适用于动态 IT 环境的服务器流量监控软件

    服务器在网络性能中起着至关重要的作用,这意味着保持其最佳容量至关重要。企业需要将 AI、ML 和云技术融入其 IT 中,从而提供充分的敏捷性、安全性和灵活性,在这方面,服务器流量监控已成为当务之急。通过定期监控通信、跟踪流量上下文和识别瓶颈,管理员可以了解

    2024年02月02日
    浏览(42)
  • SpringMvc集成开源流量监控、限流、熔断降级、负载保护组件Sentinel

    前言:作者查阅了Sentinel官网、51CTO、CSDN、码农家园、博客园等很多技术文章都没有很准确的springmvc集成Sentinel的示例,因此整理了本文,主要介绍SpringMvc集成Sentinel 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的

    2024年02月05日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包