`

使用jFreeChart实现web实时设备状态的图形化监控之三:使用jPcap抓取网络数据包小试

阅读更多
抓包前,首先要编写实现了PacketReceiver接口的类,即数据包处理器,由与抓包时,对应某个网络接口的JpcapCaptor对象会阻塞,所以我们将每个网卡上得到的对应的JpcapCaptor对象放到一个独立线程中运行;TestPacketReceiver是个数据包解析器,本例中我们只是简单打印出收到的数据包类型及关键参数,阅读如下代码建议参照jPcap的在线文档(http://netresearch.ics.uci.edu/kfujii/jpcap/doc/javadoc/index.html )

TestPacketReceiver.java代码如下:

 

import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.PacketReceiver;
import jpcap.packet.*;
/**
 * 使用jpcap显示网络上的各种数据包
 * @author www.NetJava.cn 
 */
public class DispalyNetPacket {
	
	//程序启动主方法
   public static void main(String args[]){
	   try{
			//获取本机上的网络接口对象数组
	 final	NetworkInterface[] devices = JpcapCaptor.getDeviceList();
		for(int i=0;i<devices.length;i++){
			NetworkInterface nc=devices[i];
           //创建某个卡口上的抓取对象,最大为2000个
 	    JpcapCaptor jpcap = JpcapCaptor.openDevice(nc, 2000, true, 20);
 	    startCapThread(jpcap);
 	    System.out.println("开始抓取第"+i+"个卡口上的数据");
		}
		}catch(Exception ef){
			ef.printStackTrace();
			System.out.println("启动失败:  "+ef);
		}

   }
    //将每个Captor放到独立线程中运行
   public static void startCapThread(final JpcapCaptor jpcap ){
	   JpcapCaptor jp=jpcap;
	   java.lang.Runnable rnner=new Runnable(){
		   public void run(){
			   //使用接包处理器循环抓包
			   jpcap.loopPacket(-1, new TestPacketReceiver());
		   }
	   };
	   new Thread(rnner).start();//启动抓包线程
   }    
}

/**
 * 抓包监听器,实现PacketReceiver中的方法:打印出数据包说明
 * @author www.NetJava.cn 
 */
class TestPacketReceiver  implements PacketReceiver {
	  /**
	   * 实现的接包方法:
	   */
	  public void receivePacket(Packet packet) {
		  //Tcp包,在java Socket中只能得到负载数据
		if(packet instanceof jpcap.packet.TCPPacket){
			TCPPacket p=(TCPPacket)packet;
			String s="TCPPacket:| dst_ip "+p.dst_ip+":"+p.dst_port
			         +"|src_ip "+p.src_ip+":"+p.src_port
		             +" |len: "+p.len;
		System.out.println(s);
		}
		//UDP包,开着QQ,你就会看到:它是tcp+udp
		else if(packet instanceof jpcap.packet.UDPPacket){
			UDPPacket p=(UDPPacket)packet;
			String s="UDPPacket:| dst_ip "+p.dst_ip+":"+p.dst_port
	         +"|src_ip "+p.src_ip+":"+p.src_port
            +" |len: "+p.len;
           System.out.println(s);
		}
		//如果你要在程序中构造一个ping报文,就要构建ICMPPacket包
       else if(packet instanceof jpcap.packet.ICMPPacket){
    	   ICMPPacket p=(ICMPPacket)packet;
    	   //ICMP包的路由链
    	   String router_ip="";
    	   for(int i=0;i<p.router_ip.length;i++){
    		   router_ip+=" "+p.router_ip[i].getHostAddress();
    	   }
			String s="@ @ @ ICMPPacket:| router_ip "+router_ip
			 +" |redir_ip: "+p.redir_ip
			 +" |mtu: "+p.mtu
             +" |length: "+p.len;
          System.out.println(s);
		}
		//是否地址转换协议请求包
       else if(packet instanceof jpcap.packet.ARPPacket){
    	   ARPPacket p=(ARPPacket)packet;
    	   //Returns the hardware address (MAC address) of the sender
    	   Object  saa=   p.getSenderHardwareAddress();
    	   Object  taa=p.getTargetHardwareAddress();
    	   String s="* * * ARPPacket:| SenderHardwareAddress "+saa
	         +"|TargetHardwareAddress "+taa
             +" |len: "+p.len;
         System.out.println(s);
			
		}
	//取得链路层数据头 :如果你想局网抓包或伪造数据包,嘿嘿
     DatalinkPacket datalink  =packet.datalink;
     //如果是以太网包
     if(datalink instanceof jpcap.packet.EthernetPacket){
    	 EthernetPacket ep=(EthernetPacket)datalink;
    	  String s="  datalink layer packet: "
    		  +"|DestinationAddress: "+ep.getDestinationAddress()
    		  +"|SourceAddress: "+ep.getSourceAddress();
    	  System.out.println(s);
	}	 
  }

} 

 

 

 

 运行这段程序,你机器从网络收所有收发到的数据,就都可以展现在你眼前了!,在我的机器上,摘抄一段输出如下:

datalink layer packet: |DestinationAddress: 01:00:5e:00:00:01|SourceAddress: 00:19:e0:f0:ee:55

  datalink layer packet: |DestinationAddress: 01:00:5e:26:4c:da|SourceAddress: 00:e0:81:03:7c:01TCPPacket:| dst_ip /128.195.10.200:80|src_ip /192.168.1.44:1083 |len: 62  datalink layer packet: |DestinationAddress: 00:19:e0:f0:ee:55|SourceAddress: 00:02:8a:96:d1:ab* * * ARPPacket:| SenderHardwareAddress 00:19:e0:f0:ee:55|TargetHardwareAddress 00:00:00:00:00:00 |len: 60  datalink layer packet: |DestinationAddress: ff:ff:ff:ff:ff:ff|SourceAddress: 00:19:e0:f0:ee:55* * * ARPPacket:| SenderHardwareAddress 00:02:8a:96:d1:ab|TargetHardwareAddress 00:19:e0:f0:ee:55 |len: 42  datalink layer packet: |DestinationAddress: 00:19:e0:f0:ee:55|SourceAddress: 00:02:8a:96:d1:abTCPPacket:| dst_ip /192.168.1.44:1083|src_ip /128.195.10.200:80 |len: 62  datalink layer packet: |DestinationAddress: 00:02:8a:96:d1:ab|SourceAddress: 00:19:e0:f0:ee:55
注意:你可能认为要抓取的数据包应分为发送出去的和接收到的;但对jPcap而言,数据包是从网卡上抓取到的一个packet对象,packet没有收发的概念;如果你要确定这个packet的方向,则可根据其中的属性数据值,如源地址、目标地址确认。如果想深入的研究网络协议就请继续钻研吧,我们的任务可仅仅只是统计网络流量,demo了这么多,赶快实现我们的数据统计模块:

 

分享到:
评论
1 楼 di1984HIT 2016-05-10  
好老,学习了~

相关推荐

    jfreechart处理javaweb开发系统动态监控实例

    总的来说,通过JFreeChart和Jpcap的结合使用,我们可以构建一个功能完备的Java Web网络监控系统,实时展示系统的网络状况,为开发者提供宝贵的诊断信息。在实际开发中,可以根据具体需求进一步定制和优化监控指标,...

    java中关于JFreeChart实现实时曲线图

    在Java编程语言中,利用JFreeChart库实现实时曲线图是一种常见的数据可视化技术,尤其适用于需要实时监控或展示数据变化的应用场景。JFreeChart是一个开源的Java图表库,提供了丰富的图表类型和自定义选项,使得...

    抓取数据包

    1. **打开设备**:使用 `Jpcap.openDevice()` 方法打开指定的网络设备。 2. **设置混杂模式**:通过设置 `promisc` 参数为 `true` 来开启混杂模式,使得网卡能够捕获整个网络的数据包。 3. **循环捕获数据包**:利用...

    JFreeChart 在 web中的应用

    JFreeChart 在 web中的应用JFreeChart 在 web中的应用JFreeChart 在 web中的应用JFreeChart 在 web中的应用JFreeChart 在 web中的应用

    使用JFreeChart来创建基于web的图表

    在本篇文章中,我们将深入探讨如何使用JFreeChart这一强大的Java图表库来创建基于Web的图表。通过细致地解析标题、描述以及部分已给出的内容,本文将为读者提供全面而深入的理解,帮助开发者掌握利用JFreeChart进行...

    jfreechart图形化报表

    **JFreeChart:图形化报表的强大工具** JFreeChart 是一个功能丰富的 Java 图形库,专为生成高质量的图表而设计。它广泛应用于各种应用程序,包括报表系统、数据分析软件、甚至是学术研究,提供了丰富的图形类型,...

    jfreechart+applet三维图形实例

    将JFreeChart与Applet结合,可以在Web浏览器中展示动态的、交互式的三维图形。 在"jfreechart+applet三维图形实例"中,我们主要会涉及到以下几个关键知识点: 1. **JFreeChart库的使用**:首先,我们需要了解如何...

    使用 JFreeChart来创建基于web的图表

    总之,JFreeChart是Java Web应用中实现数据可视化的强大工具。通过合理地组织数据,使用JFreeChart创建各种类型的图表,并结合Web技术,你可以为用户提供直观且交互性强的数据展示界面。不断探索和实践,你将能够...

    jfreechart国产数据库支持下Web动态统计图形实现.pdf

    ### jfreechart国产数据库支持下Web动态统计图形实现 #### 引言 随着互联网技术的飞速发展,信息系统越来越依赖于Web与数据库的结合来实现数据的存储、检索及共享功能。在这种背景下,数据可视化成为了面向Web的...

    JFreeChart -- web图表生成源码.zip_JfreeChart web_java web_jfreechart_w

    4. **动态更新**:可以实时更新图表,适应动态数据变化,如股票价格、温度监测等实时监控应用。 5. **导出功能**:JFreeChart 提供了将图表导出为 PNG、JPEG、SVG、PDF、EPS 等格式的功能,方便在报告、网页和打印...

    JFreeChart 各种图形的 web工程

    **JFreeChart——丰富的图形库在Web工程中的应用** JFreeChart是一款强大的Java图形库,它为开发者提供了绘制各种复杂图表的能力,包括折线图、饼形图、柱状图、域状图以及组合图表等。这个特定的例子是将...

    Java使用SWT JFreeChart控件实现的小游戏.zip

    Java使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的...

    java利用JFreeChart实现各种数据统计图(柱形图_饼图_折线图).pdf

    Java 利用 JFreeChart 实现各种数据统计图 本文主要介绍了使用 Java 语言和 JFreeChart 库来实现各种数据统计图的方法,包括柱形图、饼图、折线图等。统计图是数据分析和可视化的重要工具,可以帮助用户更好地理解...

    jfreechart的一个web例子

    JFreeChart 是一个开源的 Java 图形库,它为开发者提供了丰富的图表功能,包括饼图、柱状图、线图、散点图、甘特图等,广泛应用于数据可视化和报告生成。本例子将详细介绍如何在 Web 应用中使用 JFreeChart。 在 ...

    jfreechart图形

    **JFreeChart图形详解** JFreeChart是一款强大的Java图表库,它允许开发者在应用程序、Swing组件、Web应用以及各种报告中创建丰富的可视化图表。这个压缩包文件包含了一系列的示例,展示了JFreeChart库的强大功能,...

    JFreeChart实现实时曲线图

    JFreeChart实现实时曲线图 JFreeChart是Java平台上一种流行的图表库,提供了丰富的图表类型和自定义功能。...使用JFreeChart实现实时曲线图可以满足多种应用场景的需求,如股票交易、气象监测、实时监控等。

    JFreeChart实时折线图

    在本场景中,我们关注的是如何使用JFreeChart来实现实时更新的折线图。下面将详细介绍这个过程。 首先,JFreeChart的使用通常分为以下几个步骤: 1. **创建图表**: 首先,你需要创建一个`JFreeChart`对象。这可以...

    JfreeChart各种图形案例

    **JFreeChart是一种广泛使用的Java...总结来说,"JfreeChart各种图形案例"这个资源是一份宝贵的开发工具,无论你是初学者还是有经验的开发者,都可以从中受益,快速掌握JFreeChart的使用技巧,提升你的数据可视化能力。

Global site tag (gtag.js) - Google Analytics