JAVA课程设计--抓取数据包

更新时间:2023-03-11 11:36:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

**大学

计算机科学与技术学院

实验报告

( 2007 ~2008 学年度 第 一 学期 )

课程名称

项目名称

网络编程技术 网络抓包

姓名

学号

专业 计算机

班级

地点

教师

一实验目的:

1. 通过学习,使大家熟练掌握JAVA的安装,配置及其运行环境。 2. 初步掌握如何连接JAVA和数据库。

3.从网络上采集至10万个数据包分别存入TXT文件和数据库中。 4.完成协议统计、包长统计。

5.实现数据包流量的时间变化(10分钟为单位)直观的统计图。

二.软硬件环境

操作系统:Windows xp 数据库:SQL Server 2000

开发环境:JDK_1_5-0-07, WinPcap_4_0_1,JCreator Pro 3.5

三 实验原理:

1. Java语言具有以下特点:简单、面向对象、分布式、解释执行、安全、 跨平台、高性能、多线程等特点。首先安装上述开发环境中的各个软件,Winpcap 是一个第三方类库,为Jpcap提供基础类Jpcap是一个静态库,可以被包截获程序直接调用,它应用Packet.dll导出的服务向上层应用程序提供强有力的截获界面。它是应用程序的一部分。 1)建立获取网络数据包的程序为JpcapTip.java

2)建立数据包流量的时间变化直观图和包长统计为ImageTest.java 3)建立对数据进行协议统计的程序为ConnServer.java

2. 在JpcapTip.java中向txt文件写入10万个IP数据包,包括(IP的源地址,目标地址,高层协议,长度, 版本号,标识符,标志,段偏移量,数据报的寿命数值,服务型号,数据),然后在把IP数据包的信息存放到SQL server 2000的数据库中。

3. 在ImageTest.java中统计共收集多少个数据包,计算平均包长,并统计包长。 4. 在ConnServer.java中协议统计。

四、网卡设置

1:openDevice

public static Jpcap openDevice(java.lang.String device, int snaplen, boolean promisc, int to_ms),第一个参数为string,指定要打开的设备名;第二个参数为int,指定每个包返回数据的长度;第三个参数为混杂标志,如果设为1,将网卡设置为混杂模式,监听全网段。第四个参数为以毫秒计超时时限。

2:getDeviceDescription

public static java.lang.String[] getDeviceDescription()

3:loopPacket

public int loopPacket(int count, JpcapHandler handler) 五、流程图

getDeviceList() 获得当前得到设备名

Set become promiscuous mode 设置网卡为混杂模式

loopPacket抓包 是否属于IP数据包

Y 转换成IPPacket Y N 抓包数是否为10000倍 Y 存入packe(n+1).txt 存入packe (n).txt

六 源程序

import jpcap.*;

import jpcap.packet.*; import java.io.*;

import java.sql.*;

import java.net.InetAddress; import java.lang.*;

public class getMessage1 implements PacketReceiver {

public void receivePacket(Packet packet) //实现接口PacketReceiver类中的receivePacket方法 {

System.out.println(\ }

public static void main(String[] args) { //定义变量用存放数据包的相应的信息

String src_ip=\ //IP的源地址 String dst_ip=\ //IP目标地址 int protocol=0; //IP高层协议 int length=0; //IP长度 int version=0; //IP版本号

Packet pa; try {

NetworkInterface[] NI=JpcapCaptor.getDeviceList(); //获取设备列表名

JpcapCaptor jpcap1= JpcapCaptor.openDevice(NI[1], 1024, true, 50); // 打开网卡设备

for(int j=0;j<100000;j++) //循环获取数据包 {

pa=jpcap1.getPacket(); //获取数据包

if (pa instanceof IPPacket) //判断是否为IP数据包

{

IPPacket ip=(IPPacket)pa;

System.out.println(ip.src_ip+\ ip.length+\

ip.rsv_frag+\ //屏

幕输出IP数据包的信息

RandomAccessFile rf = new RandomAccessFile(\把IP数据包写入到文本文件,创建一个用来输入输出RandomAccessFile流,文件名为packet

rf.seek(rf.length()); //定位文件指针在文件中的最后

rf.writeBytes(ip.src_ip+\

ip.length+\

ip.offset+\ /*向txt文件写入IP的源地址,目标地址,高层协议,长度, 版本号,标识符(序号),标志,段偏移量,数据报的寿命数值,服务型号*/ rf.close();

//将IP数据包的信息写入数据库 src_ip=ip.src_ip.toString(); dst_ip=ip.dst_ip.toString(); protocol=ip.protocol; length=ip.length; version=ip.version;

String JDriver=\ //驱动程序名

String conURL=\ //数据源

try {

Class.forName(JDriver); //获取驱动程序并加载

}

catch(java.lang.ClassNotFoundException e) {

System.out.println(\ }

Connection

con=DriverManager.getConnection(conURL);//建立数据库的连接

Statement s=con.createStatement(); //创建Statement对象用来执行SQL 语句 String query=\into captor values('\

s.executeUpdate(query); //执行SQL语句命令 s.close();

con.close(); //关闭操作 } } }

catch (Exception e) {

e.printStackTrace(); } } }

********************************************************* //ImageTest.java(实现对数据包流量的时间变化的直方图输出) //ImageTest.java(实现对数据包流量的时间变化的直方图输出) import java.awt.geom.*; import java.awt.image.*; import java.awt.event.*; import javax.swing.*; import java.awt.*;

//import jpcap.JpcapHandler; //import jpcap.Jpcap; //import jpcap.Packet; import java.awt.Graphics; import java.io.*;

import java.awt.font.*; import jpcap.*;

import jpcap.packet.*; import java.io.*; import java.lang.*; import java.sql.*;

public class ImageTest extends JFrame {

static int i=0; static int v=0;

static int[] arry = new int [220];

public void ImageTest() {

setSize(250,200);

}

public void paint(Graphics g) {

int w=0; int x=0; int y=0;

Graphics2D g2d=(Graphics2D)g;

g.setColor(Color.red); for(;x<40;x++)

g.drawLine(0,50+10*x,1000,50+10*x);

g.setColor(Color.black);

g.drawLine(0,50+10*x,1000,50+10*x);

repaint();

for(int z=1;w<200;w++,z++) {

g2d.setColor(Color.LIGHT_GRAY);

g.fillRect(50+(w+z),450-JpcapTip.arry[w],2,JpcapTip.arry[w]);

z=z+2;

g2d.setColor(Color.DARK_GRAY);

g.fillRect(50+(w+z),450-JpcapTip.arry[w],1,450); } }

public static void main(String arg[]) throws java.io.IOException {

int j=0; int k=1; int h=0;

long total=0;

NetworkInterface[] devices = JpcapCaptor.getDeviceList(); NetworkInterface deviceName = devices[1];

JpcapCaptor jpcap1 = JpcapCaptor.openDevice(deviceName, 1028, true, 100);

JFrame frame=new ImageTest(); frame.setSize(900,470);

frame.setBackground(Color.DARK_GRAY); frame.setVisible(true); for(;k<=200;k++)

{

jpcap1.loopPacket(1, new JpcapTip());

System.out.print( JpcapTip.p); System.out.print(\所抓的第\ System.out.print( k +\个包的长度: \所抓的第%d个包的长度为:\ System.out.println(JpcapTip.arry[k-1]); total=total+JpcapTip.arry[k-1];

i++;

v++;

frame.setTitle(\流量统计图 平均流量为:\包/秒\ } } }

****************************************************** 七 实验结果 截获的数据包:

数据包流量的时间变化的直方图

八 心得体会

本文来源:https://www.bwwdw.com/article/qvww.html

Top