生成连续图表的代码我们放在MonitorChartServlet中;其机制是:客户端每请求一次,则生成一张使用历史数据和本次请求所采集到的数据生成一张图片送出。这里的关键字是“连续”,我们得好好解释下:实时监控其时是监视在某一个时间段内,各个时间点上的数据流量;也就是说,时间点的个数量固定的,本例中定为15,而时间段是滑动的,滑动窗口的大小也就是15;客户端每次请求上来时,首先要查看时间窗口是否己满,如己满,则去掉最早的一个时间点上采集的数据和对应的时间点;将当前采集到的数据和时间点放入队列中。这样依次类推,服务器上就保存着一个连续数据和对应时间点的队列;而时间点之音的单位,则由前台页面的定时器控制,前台多久请求一次,时间单位就是多少。 MonitorChartServlet要负责维护这个队列并根据队列的数据生成表图输出。其代码如下:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
/**
*提供顺序时间图表的Servlet
*author:胡东峰
*/
public class MonitorChartServlet extends HttpServlet {
/**网络接口名字数组:生成图表中序列的个数*/
private static String[] netNamearray;
/** 网络名字:对应的历史值列表*/
private static Map<String,LinkedList<Integer>> nameValueOfList=new HashMap();
/**图表上最长展示的时间点个数:超过则从时间表后面移走*/
private static final int timeLen=15;
/**保存时间线的队列*/
private static java.util.LinkedList<String> timeList=new java.util.LinkedList();
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try{
response.setHeader("Cache-Control", "no-cache");
response.setContentType("image/png");
java.io.OutputStream ous=response.getOutputStream();
//创建一个数据集对象:
DefaultCategoryDataset data= getCategoryDataset();
JFreeChart chart =ChartFactory.createLineChart("网络流量实时监控@NetJava.cn","时间(ff:ss)","数 量",data,PlotOrientation.VERTICAL,true,false,false);
//美化一下:)
// processChart(chart);
ChartUtilities.writeChartAsPNG(ous, chart,800, 300);
ous.flush();
ous.close();
System.out.println("图片输出完成....");
}catch(Exception ef){ef.printStackTrace();}
}
/**
* 生成bar图的数据集:
* @return:可用于Bar图的数据集
* 不想那么细了,这个方法全同步.
*/
public synchronized DefaultCategoryDataset getCategoryDataset(){
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
//将网络流量map中的key,即IP名转为数组
Map<String,Integer> netMap= Tcpdump.ins().getNameTrafficMap();
System.out.println("---本次提取数据------: "+netMap.toString());
Set<String> ss= netMap.keySet();
String[] forTest=new String[ss.size()];
netNamearray= ss.toArray(forTest);
System.out.println("---网卡个数------: "+netNamearray.length);
//初化化放置具体流量数据的结构
for(int i=0;i<netNamearray.length;i++){
if(!nameValueOfList.containsKey(netNamearray[i])){
nameValueOfList.put(netNamearray[i], new LinkedList());
System.out.println("---监控-----------: "+netNamearray[i]);
}
}
System.out.println("---监控Servlet初始化OK,监控网卡个数-----------: "+netNamearray.length);
//将网卡上的计数加入每个卡名对应的列表
for(int i=0;i<netNamearray.length;i++){
String key=netNamearray[i];
int currnetValue= netMap.get(key);
// 清空网络流量map中原来的数据
netMap.put(key, 0);
LinkedList historyValueList=nameValueOfList.get(key);
//历史数据表中没有超过timeLen个时,加入列表头中
if(historyValueList.size()<timeLen){
historyValueList.addFirst(currnetValue);
}
else{
historyValueList.removeLast();
historyValueList.addFirst(currnetValue);
}
}
//查看是否要根据本次请求更新时间线:
if(timeList.size()<timeLen){
//加入到前面
timeList.addFirst(currentTime());
}else{
//移除后面的时间
timeList.removeLast();
// 加入到前面
timeList.addFirst(currentTime());
}
//将数据填充到dataset中
for (int i = 0; i < netNamearray.length; i++) {
LinkedList<Integer> historyValueList=nameValueOfList.get(netNamearray[i]);
for (int series = 0; series <timeList.size(); series ++) {
//某个序列数据列长度不够,要补全,本处补为0
if(historyValueList.size()==series){
historyValueList.addFirst(0);
}
int value=historyValueList.get(series);
// value=new java.util.Random().nextInt(300)+100;
dataset.addValue(value, netNamearray[i], timeList.get(series));
}
}
return dataset;
}
/**
*当前时间信息
* @return:当前时间串
*/
private static String currentTime(){
Date d = new Date();
SimpleDateFormat kk=new SimpleDateFormat("mm:ss");
String strTime=kk.format(d);
return strTime;
}
public void init() throws ServletException {
}
}
现在,将所有程序布署,测试这个Servlet;如果你还是忘了jPcap调用的是本机的dll库,测试时肯定会出错,除非你将jpcap.all己复制到tomcat下面的bin目录下!现在,你是否可以输出连续时间的图片?
如果成功的话,可以看到,前几次请求,图片上的时间轴会增加,加到15时,每次生成的新图就会去掉最后的一个时间点,而将当前时间点上的数据加到图中: 每次请求游览器上所看到的图片如下:
现在证明生成图片的Servlet能够正常工作了,但这还不要我们要的结果---在页面上自动更新图片----这太简单了:
- 描述: jFreeChart展示的连续时间段抓包图表
- 大小: 1.3 MB
分享到:
相关推荐
它提供了一种灵活的方式来创建高质量的2D图表,可以在各种Java应用程序中使用,例如桌面应用、Web应用或者服务器端应用。下面我们将深入探讨JFreeChart的使用方法、特点以及如何生成这些图表。 1. **JFreeChart的...
JFreeChart还支持动态更新图表,使得实时数据展示成为可能。其详细的帮助文档和实例使得开发者能够快速上手并充分利用该库。 要使用JFreeChart生成图形报表,首先需要在项目中引入JFreeChart的依赖。这可以通过...
在实际应用中,JFreeChart还支持动态更新图表,这对于实时监控和数据分析尤其有用。通过修改数据集并重绘图表,可以实现数据变化时图表的即时更新。 为了更好地利用JFreeChart,你需要了解以下几个关键概念: - **...
这些图表类型广泛应用于商业报告、数据分析和监控系统,为用户提供直观的数据展示。 ### 4. JFreeChart核心类库介绍 JFreeChart的核心类库主要由`org.jfree.chart`和`org.jfree.data`两个包组成。前者关注图表本身...
Java开发中,生成报表是一项重要的任务,它可以帮助我们直观地展示数据,便于理解和分析。在众多的Java报表库中,JFreeChart无疑是一把不可或缺的利器。本文将深入探讨JFreeChart的核心功能、使用方法以及在实际项目...
2. **监控系统**:在系统监控领域,可以利用JFreeChart 实时展示服务器性能、网络流量等数据,便于问题排查和优化。 3. **教育科研**:在教学和研究中,JFreeChart 能够清晰地展示实验数据和研究成果,提高表达效果...
这个库特别适合那些需要在 Java 应用程序、Web 应用、报表系统或移动应用中展示数据可视化的开发者。 **2. 安装与集成** 要使用 JFreeChart,首先需要将其 jar 文件添加到项目的类路径中。在提供的压缩包中,应该...
- 动态更新:JFreeChart支持图表数据的实时更新,适合于动态监控场景。 - 图表交互:用户可以通过鼠标点击、拖动等方式与图表进行交互,例如缩放、平移等。 - 自定义样式:通过ChartCustomizer或直接修改图表的...
总结来说,JFreeChart 是 Java 开发者用于创建高质量图表的强大工具,尤其在 Web 应用场景下,结合 Servlet 和 JSP,可以方便地生成动态图表,满足数据分析、监控和报告的需求。这个例子展示了如何实现这一过程,对...
结合Struts2和JFreeChart,开发者可以创建交互式、数据丰富的Web应用,将后台处理的数据以图形方式展示给用户,提升用户体验。下面我们将深入探讨如何在Struts2框架中集成JFreeChart,并通过一个实际的运行实例来...
2. **监控系统**:在系统监控界面,JFreeChart可以实时展示各项性能指标,如CPU使用率、内存占用等。 3. **金融应用**:在股票交易、银行理财等领域,时间序列图表能够清晰地展示价格波动趋势。 4. **教育软件**:...
同时,也可以通过Servlets和JSP在Web应用中生成动态图表。 6. **数据源支持**:JFreeChart支持多种数据源,如数组、列表、Map、数据库查询结果等,方便地将数据转换为图表。 7. **实验性功能**:`jfreechart-...
在Web开发中,JFreeChart曾是Java领域用于生成图表的常用库,但它需要服务器端生成图像并传递给客户端。相比之下,FusionCharts则完全基于JavaScript,所有的数据处理和图表渲染都在客户端完成,这减少了服务器的...