如果上面的例子你理解了,那么统计流量数据将是一件非常简单的事;我们的需求就是怎么将这个小模块设计得更加紧凑以便其它对象调用。 流量采集器对外提供调用的类是Tcpdump.java,这个类要根据网卡个类启动对应的后台线程抓取统计数据---也就是说这个启只能启动一次所有线程,无论其它对象如何调用它。因此我们将Tcpdump.java设计为单实例类;Tcpdump类所要启动的后台线程是LoopPacketThread.java,这个类是实现了Thread的线程,它的run方法中将运行对应的网卡数据统计调用; Tcpdump类中有一个Map,用以存放对应网卡上采集的数据,采集线程会将统计到的数据根据其对应的网卡名字放入到Map中保存。 首先我们看LoopPacketThread.java类的实现:
/**
*统计某一个网卡上流线的线程
* @author www.NetJava.cn
*/
class LoopPacketThread extends Thread{
private JpcapCaptor jpcap ;
private String ipAdd;
/**
* 构造器
* @param jpcap:cap对象
* @param ipAdd:网络地址名字
*/
public LoopPacketThread(JpcapCaptor jpcap,String ipAdd){
this.jpcap=jpcap;
this.ipAdd=ipAdd;
}
public void run(){
//-1表示永远抓取
this.jpcap.loopPacket(-1, new DumpPacket(this.ipAdd));
}
}
这个类很简单,关键是它的run方法中,在loopPacket时传入了DumpPacket对象,DumpPacket.java是实现了PacketReceiver接口的类,在其中对网卡数据进行统计,并将统计结果放入缓存:
/**
* 抓包监听器,实现PacketReceiver中的方法,当数据包到达时计数.
* @author www.NetJava.cn
*/
class DumpPacket implements PacketReceiver {
private String ipAdd;
DumpPacket(String ipAdd){
this.ipAdd=ipAdd;
}
//实现包统计
public void receivePacket(Packet packet) {
//将数据加入缓存表中待图片生成servlet提取
Tcpdump.ins().putNetValue(ipAdd, packet.len);
System.out.println(currentTime()+": "+ipAdd+" 收到长度为:*"+ packet.len);
System.out.println(packet);
}
/**
*日志时间信息
* @return:日志内容时间
*/
private static String currentTime(){
Date d = new Date();
SimpleDateFormat kk=new SimpleDateFormat("mm:ss");
String strTime=kk.format(d);
return strTime;
}
}
OK,接下来就是关键的Tcpdump类实现了:
/**
* 1.使用jpcap抓取网络流量的主类,
* 2.这个类要根据网卡个数,启动线程分别抓取各个网卡上的流量入表中
* 3.生成图表的对象从流量表中取出数据
* 4.这个类设计为单实例,在第一次调用时启动抓数据线程;
* 5.目前没有设计停止抓取机制....
* @author www.NetJava.cn
*/
public class Tcpdump {
/**
* 单实例调用:其它对象调用这个类的方法时,必须通过这个方法
* 这样,保证了流量统计线程的启动,且只启动了一次
* */
public synchronized static Tcpdump ins(){
if(null==tcpdump){
tcpdump=new Tcpdump();
tcpdump.init();
}
return tcpdump;
}
/**生成报表的Servlet调用用于生成图表中数据*/
public Map<String, Integer> getNameTrafficMap(){
return nameTrafficMap;
}
/**
* 根据网卡个数,启动统计线程
* 注意:本地地址,即127.0.0.1上的不统计
*/
private void init() {
try{
//获取本机上的网络接口对象
final NetworkInterface[] devices = JpcapCaptor.getDeviceList();
for(int i=0;i<devices.length;i++){
NetworkInterface nc=devices[i];
//大与零则为有效网卡,不抓本机地址.
if(nc.addresses.length>0){
//一个网卡可能有多个地址,只取第一个地址
String addr=nc.addresses[0].address.toString();
// 创建某个卡口上的抓取对象,
JpcapCaptor jpcap = JpcapCaptor.openDevice(nc, 2000, true, 20);
//创建对应的抓取线程并启动
LoopPacketThread lt=new LoopPacketThread(jpcap,addr);
lt.start();
System.out.println( addr+"上的采集线程己启动************");
}
}
}catch(Exception ef){
ef.printStackTrace();
System.out.println("start caputerThread error ! ! ! !"+ef);
}
}
/**IP和抓到包的长度放入hash表中,用表中长度加入放入的长度*/
void putNetValue(String name,int value){
if(nameTrafficMap.containsKey(name)){
value=nameTrafficMap.get(name)+value;
nameTrafficMap.put(name, value);
}else{
nameTrafficMap.put(name, value);
}
}
private Tcpdump(){}
/**存入某个地址名字和流量统计值*/
private Map<String, Integer> nameTrafficMap=new java.util.HashMap();
//单实例
private static Tcpdump tcpdump=null;
}
这个类除了要注意单实例设计模式个,关键的一个方法是:
/**IP和抓到包的长度放入hash表中,用表中长度加入放入的长度*/
void putNetValue(String name,int value){
if(nameTrafficMap.containsKey(name)){
value=nameTrafficMap.get(name)+value;
nameTrafficMap.put(name, value);
}else{
nameTrafficMap.put(name, value);
}
}
这个方法保证了采集到的数据在内存中的连续性,生成图片的Servlet从这个map中每取一次对应网卡的数据,就将其历史统计值清零。这三个类都理解完毕后,我们可以写一个方法来测试它是否正常:
public static void main(String args[]){
//启动统计线程
Tcpdump.ins();
//模拟数据提取线程
new Thread(
new Runnable(){
public void run(){
while(true){
try{
Thread.sleep(3000);
}catch(Exception ef){}
System.out.println("***********统计到的数据************");
System.out.println(Tcpdump.ins().getNameTrafficMap());;
}
}
}
).start();
}
这个方法在启动了采集线程后,接着启动一个线程每隔3秒打印一次采集到的数据,在我的机器上,开两块网卡,打印出的结果如下: . . . ***********统计到的数据************{/192.168.1.44=112711, /220.192.158.79=16653}***********统计到的数据************{/192.168.1.44=113639, /220.192.158.79=17567}***********统计到的数据************{/192.168.1.44=114567, /220.192.158.79=21289}***********统计到的数据************{/192.168.1.44=115379, /220.192.158.79=25288}. . . |
注意,测试为,为了保证两个卡上都有数据流,你要想点办法J 测试成功后,一个关键的部分就完成了,接下来我们看如何在Servlet中实现绘制连续的监视图表。
分享到:
相关推荐
总的来说,通过JFreeChart和Jpcap的结合使用,我们可以构建一个功能完备的Java Web网络监控系统,实时展示系统的网络状况,为开发者提供宝贵的诊断信息。在实际开发中,可以根据具体需求进一步定制和优化监控指标,...
在Java编程语言中,利用JFreeChart库实现实时曲线图是一种常见的数据可视化技术,尤其适用于需要实时监控或展示数据变化的应用场景。JFreeChart是一个开源的Java图表库,提供了丰富的图表类型和自定义选项,使得...
JFreeChart 在 web中的应用JFreeChart 在 web中的应用JFreeChart 在 web中的应用JFreeChart 在 web中的应用JFreeChart 在 web中的应用
**JFreeChart:图形化报表的强大工具** JFreeChart 是一个功能丰富的 Java 图形库,专为生成高质量的图表而设计。它广泛应用于各种应用程序,包括报表系统、数据分析软件、甚至是学术研究,提供了丰富的图形类型,...
随着互联网技术的飞速发展,信息系统越来越依赖于Web与数据库的结合来实现数据的存储、检索及共享功能。在这种背景下,数据可视化成为了面向Web的信息系统中至关重要的组成部分之一。其中,统计图形作为一种直观、...
在本篇文章中,我们将深入探讨如何使用JFreeChart这一强大的Java图表库来创建基于Web的图表。通过细致地解析标题、描述以及部分已给出的内容,本文将为读者提供全面而深入的理解,帮助开发者掌握利用JFreeChart进行...
Java 利用 JFreeChart 实现各种数据统计图 本文主要介绍了使用 Java 语言和 JFreeChart 库来实现各种数据统计图的方法,包括柱形图、饼图、折线图等。统计图是数据分析和可视化的重要工具,可以帮助用户更好地理解...
总之,JFreeChart是Java Web应用中实现数据可视化的强大工具。通过合理地组织数据,使用JFreeChart创建各种类型的图表,并结合Web技术,你可以为用户提供直观且交互性强的数据展示界面。不断探索和实践,你将能够...
**JFreeChart——丰富的图形库在Web工程中的应用** JFreeChart是一款强大的Java图形库,它为开发者提供了绘制各种复杂图表的能力,包括折线图、饼形图、柱状图、域状图以及组合图表等。这个特定的例子是将...
**JFreeChart图形详解** JFreeChart是一款强大的Java图表库,它允许开发者在应用程序、Swing组件、Web应用以及各种报告中创建丰富的可视化图表。这个压缩包文件包含了一系列的示例,展示了JFreeChart库的强大功能,...
4. **动态更新**:图表可以实时响应数据变化,实现动态更新,这对于监控系统或者数据可视化的应用非常实用。 5. **输出格式广泛**:JFreeChart可以生成静态图像(如PNG、JPEG、SVG),也可以导出为PDF或SVG矢量图,...
4. **动态更新**:可以实时更新图表,适应动态数据变化,如股票价格、温度监测等实时监控应用。 5. **导出功能**:JFreeChart 提供了将图表导出为 PNG、JPEG、SVG、PDF、EPS 等格式的功能,方便在报告、网页和打印...
在IT行业中,尤其是在数据分析和可视化领域,`JFreeChart`是一个非常重要的库,它为Java开发者提供了丰富的图表绘制功能,包括但不限于柱状图、饼图、折线图、散点图等。本话题主要聚焦于如何使用`JFreeChart`在Web...
2. **监控系统**:在系统监控领域,可以利用JFreeChart 实时展示服务器性能、网络流量等数据,便于问题排查和优化。 3. **教育科研**:在教学和研究中,JFreeChart 能够清晰地展示实验数据和研究成果,提高表达效果...
在本场景中,我们关注的是如何使用JFreeChart来实现实时更新的折线图。下面将详细介绍这个过程。 首先,JFreeChart的使用通常分为以下几个步骤: 1. **创建图表**: 首先,你需要创建一个`JFreeChart`对象。这可以...
**JFreeChart是一种广泛使用的Java...总结来说,"JfreeChart各种图形案例"这个资源是一份宝贵的开发工具,无论你是初学者还是有经验的开发者,都可以从中受益,快速掌握JFreeChart的使用技巧,提升你的数据可视化能力。
JFreeChart 是一个开源的 Java 图形库,它为开发者提供了丰富的图表功能,包括饼图、柱状图、线图、散点图、甘特图等,广泛应用于数据可视化和报告生成。本例子将详细介绍如何在 Web 应用中使用 JFreeChart。 在 ...
Java使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的...