您的位置:首页 > 编程语言 > Java开发

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对数据绘图:



总结


其实并不难,就是捣鼓的时候有点费事,毕竟人生在于捣鼓嘛…好久没更新博客了,嘻嘻,甜到忧伤…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: