JAVA课程设计--抓取数据包
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
**大学
计算机科学与技术学院
实验报告
(2007 ~2008 学年度第一学期)
课程名称网络编程技术
项目名称网络抓包
姓名学号
专业计算机班级
地点教师
一实验目的:
1. 通过学习,使大家熟练掌握JA VA的安装,配置及其运行环境。
2. 初步掌握如何连接JA VA和数据库。
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(ng.String device, int snaplen, boolean promisc, int to_ms),第一个参数为string,指定要打开的设备名;第二个参数为int,指定每个包返回数据的长度;第三个参数为混杂标志,如果设为1,将网卡设置为混杂模式,监听全网段。第四个参数为以毫秒计超时时限。
2:getDeviceDescription
public static ng.String[] getDeviceDescription()
3:loopPacket
public int loopPacket(int count, JpcapHandler handler) 五、流程图
六源程序
import jpcap.*;
import jpcap.packet.*;
import java.io.*;
import java.sql.*;
import .InetAddress;
import ng.*;
public class getMessage1 implements PacketReceiver
{
public void receivePacket(Packet packet) //实现接口PacketReceiver类中的receivePacket方法
{
System.out.println("ok");
}
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+"\t"+ip.dst_ip+"\t"+ip.protocol+"\t"+
ip.length+"\t"+ip.version+"\t"+ip.ident+"\t"+
ip.rsv_frag+"\t"+ip.offset+"\t"+ip.hop_limit+"\t"+ip.rsv_tos+"\r\n"); //屏
幕输出IP数据包的信息
RandomAccessFile rf = new RandomAccessFile("packet.txt", "rw");//把IP数据包写入到文本文件,创建一个用来输入输出RandomAccessFile流,文件名为packet
rf.seek(rf.length());
//定位文件指针在文件中的最后
rf.writeBytes(ip.src_ip+"\t"+ip.dst_ip+"\t"+ip.protocol+"\t"+
ip.length+"\t"+ip.version+"\t"+ip.ident+"\t"+ip.rsv_frag+"\t"+
ip.offset+"\t"+ip.hop_limit+"\t"+ip.rsv_tos+"\r\n");
/*向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="sun.jdbc.odbc.JdbcOdbcDriver"; //驱动程序名
String conURL="jdbc:odbc:test"; //数据源
try
{
Class.forName(JDriver); //获取驱动程序并加载
}
catch(ng.ClassNotFoundException e)
{
System.out.println("ForName:"+e.getMessage());
}
Connection
con=DriverManager.getConnection(conURL);//建立数据库的连接
Statement s=con.createStatement(); //创建Statement对象用来执行SQL 语句
String query="insert into captor values('"+src_ip+"','"+dst_ip+"','"+protocol+"','"+length+"','"+version+"')";