IP数据包的流量统计(JAVA语言)
2014-06-11 23:19
267 查看
如果不显示图片,或者出现排版错误,抽风,崩坏,节操丢失等一系列不正常情况,请点击下面链接观看,点我
IP数据包的流量统计(JAVA语言)
要求:编制程序,监控网络,捕获一段时间内网络上的IP数据包,按数据包的源地址统计出该源地址在该时间段发出的IP包的个数,将其写入日志文件中或者用图形表示出来.
课程设计,感觉挺有意思的.就想做出来,但自己虽然学过一点JAVA语言但是有些东西并不会,并且对网络协议也不是特别熟悉,但是,这并不妨碍把它做出来,就是这样有些东西至少你想不想去做而已.老罗说:
我并不在乎输赢,我只想证明我认真!
思路
用jpcap捕获到IP数据包,然后写入本地,最后用PHP读取本地文件,将数据做成柱状图.
工具
jdk(我的版本:1.8.0_05)
jpcap(我的版本:0.01.16-win32)
Winpcap(我的版本:4_1_3)
eclipse
操作系统:windows8.1,32位
jpcap和Wincap是环境所需要的,在网上也能下到,这里我放在网盘里:点我下载
环境配置
JDK配置
这个就不多说了,会点JAVA的人都懂的…
JPACAP配置
这个我也是参照网上的教程,查看这个博客的第二个部分eclipse的配置.
值得注意的是,
Jpcap.jar文件就是
net.sourceforge.jpcap-0.01.16.jar.
问题1:
配置完可能会出现的问题:
PacketCapture: loading native library jpcap.. ok Exception in thread "main" java.lang.UnsatisfiedLinkError: findDevice at net.sourceforge.jpcap.capture.PacketCapture.findDevice(Native Method) at subjectprogram.CapturePacketTest.main(CapturePacketTest.java:57)
解决办法
将
Jpcap.dll文件放入jre中,两个都放.也就是JDK下有个jre文件夹,也将这个文件放出对应的目录中,我是这么解决的.
问题2:ECLIPSE中出现-访问限制由于对必需的库XX具有一定限制,因此无法访问类型
解决办法:
也是参考别人的方法,博客地址.
代码部分
配置完所有的环境,没有错误就可以开始写代码了,代码不多,基本上都是用包中的方法:
CapturePacketTest.java
import net.sourceforge.jpcap.capture.*; import net.sourceforge.jpcap.net.*; import java.io.IOException; import java.io.RandomAccessFile; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; public class CapturePacketTest implements RawPacketListener,PacketListener{ public static int number = 1; Map<String, String> statics = new HashMap<String, String>(); public static void main(String[] args)throws Exception{ PacketCapture pcap = new PacketCapture(); //查看所有的网卡 String[] capDevices = PacketCapture.lookupDevices(); int capdevice_num = capDevices.length; //打印网卡列表 System.out.println("---------网卡列表:-------------------------"); for(int i = 0 ;i<capdevice_num;i++){ System.out.println("第"+(i+1)+"号网卡:\n"+capDevices[i]); } System.out.println("---------默认采用6号网卡,下面开始捕获:----------"); //暂停2秒 for(int i =0 ;i<20;i++){ Thread.sleep (100); System.out.print(">>"); } System.out.println(); //获取第6号网卡的物理地址,我的是6号网卡,你的并不一定是,在网卡列表中查看你说用的网卡,并选择序号,capDevices[0]表示1号网卡 String capdevice_6 = capDevices[5].split("\n")[0]; // 开始捕获,并设置为混杂模式 pcap.open(capdevice_6,true); //递归调用 CapturePacketTest t1= new CapturePacketTest(); //原始数据包监听 pcap.addRawPacketListener(t1); //数据包监听 pcap.addPacketListener(t1); //结束捕获 pcap.capture(-1); } //接口实现,没用 public void rawPacketArrived(RawPacket rawPacket) { // TODO 自动生成的方法存根 } //当获取到IP数据包 public void packetArrived(Packet packet) { //判断是否是IP数据包,如果是,则进行统计 if( packet instanceof IPPacket){ IPPacket ippacket = ((IPPacket)packet); //获取当前时间 Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); String current_time=sdf.format(d); //String echo = "IP包个数:"+(number++)+"||当前时间("+current_time+")::源地址("+ippacket.getSourceAddress()+")-->目的地址("+ippacket.getSourceAddress()+")"; String echo = "Number of IP Package:"+(number++)+"||Current Time("+current_time+")::Source IP:("+ippacket.getSourceAddress()+")-->Destination IP("+ippacket.getDestinationAddress()+")"; //String echo ="版本:"+ippacket.getVersion()+"头长度"+ippacket.getHeaderLength()+"服务类型:"+ippacket.getTypeOfService()+"数据包总长度:"+ippacket.getLength()+"数据包标示"+ippacket.getId()+"分段标志"+ippacket.getFragmentFlags()+"分段偏移值"+ippacket.getFragmentOffset()+"生存时间"+ippacket.getTimeToLive()+"上层3协议类型"+ippacket.getEthernetProtocol()+"头校验和"+ippacket.getChecksum()+"源地址"+ippacket.getSourceAddress()+"目的地址"+ippacket.getDestinationAddress() ; System.out.println(echo); //statics.put(ippacket.getSourceAddress(),"1"); //对文件进行写入 try { // 打开一个随机访问文件流,按读写方式 RandomAccessFile randomFile = new RandomAccessFile("H://capture.txt", "rw"); // 文件长度,字节数 long fileLength = randomFile.length(); //将写文件指针移到文件尾。 randomFile.seek(fileLength); randomFile.writeBytes(ippacket.getSourceAddress()+"\r\n"); randomFile.close(); } catch (IOException e) { e.printStackTrace(); } } } }
然后用PHP读取保存在H盘的capture.txt文件,并处理绘图:
capture.php
<?php require_once ('jpgraph/src/jpgraph.php'); require_once ('jpgraph/src/jpgraph_bar.php'); $capture = file_get_contents("H://capture.txt"); $array = explode("\r\n", $capture); $ac= array_count_values($array); $key = array(); $value = array(); foreach ($ac as $k => $v) { if ($k !='' && $v !='') { array_push($key, $k); array_push($value, $v); } } $datay=$value; // Create the graph. These two calls are always required $graph = new Graph(980,1300,'auto'); $graph->SetScale("textlin"); $theme_class=new UniversalTheme; $graph->SetTheme($theme_class); $graph->Set90AndMargin(200,160,160,160); $graph->img->SetAngle(90); // set major and minor tick positions manually $graph->SetBox(true); //$graph->ygrid->SetColor('gray'); $graph->ygrid->Show(true); $graph->ygrid->SetFill(false); $graph->xaxis->SetTickLabels($key); $graph->yaxis->HideLine(false); $graph->yaxis->HideTicks(false,false); // For background to be gradient, setfill is needed first. $graph->SetBackgroundGradient('#00CED1', '#FFFFFF', GRAD_HOR, BGRAD_PLOT); // Create the bar plots $b1plot = new BarPlot($datay); // ...and add it to the graPH $graph->Add($b1plot); $b1plot->SetWeight(0); $b1plot->SetFillGradient("#808000","#90EE90",GRAD_HOR); $b1plot->SetWidth(17); $b1plot->value->show(); // Display the graph $graph->Stroke(); ?>
结果
JAVA程序捕获IP包:
PHP对数据绘图:
总结
其实并不难,就是捣鼓的时候有点费事,毕竟人生在于捣鼓嘛…好久没更新博客了,嘻嘻,甜到忧伤…
相关文章推荐
- 网站流量统计,java+jsp 获取访客浏览器,真实ip,操作系统,来源
- 网站流量统计,java+jsp 获取访客浏览器,真实ip,操作系统,来源
- Java学习之道:网站流量统计的:pv,uv,ip说明
- jquery中防刷IP流量软件影响统计的一点对策
- 用java语言编程统计程序的行数
- 关于javaweb流量统计软件的分
- 使用IPTABLES实现对特定IP, 3ff8 端口流量的精确统计
- ip数据包流量实时监控Iptraf
- 流量监控,网络IP之间数据包监控简法!!
- php根据ip来进行流量统计
- Java web----Filter之分ip统计网站的访问次数
- 用java listener统计在线人数,并获取session中对应的ip
- Java web 实现 之 Filter分析ip统计网站的访问次数
- jquery中防刷IP流量软件影响统计的一点对策
- 项目中用到的一个简单的流量统计例子-java流量统计
- 使用IPTABLES实现对特定IP,端口流量的精确统计
- 使用shell统计ip的流量
- 统计JAVA网站访问次数并获得访问者IP
- 如何统计JAVA网站访问次数并获得访问者IP
- 简记:分析路由器流量ip统计页面