【JavaSE】网络编程 Jpcap的使用
前言:由于之前课程需要做个网络课程设计,题目是IP数据包的捕获与解析,考虑再三之后选择用Java来做(主要是因为Java界面比较好写,个人这么觉得),于是在做课设的过程中搜寻大量相关资料找到Jpcap这么个扩展包,JavaSE中对TCP,UDP都做了很好的封装,很方便的可以进行数据的交互,但是却没能将这些包进行抓捕和解析,Jpcap刚好弥补了这一点,通过封装好的类和方法来调用Winpcap进行抓包并进行解析,完美的解决了这个问题,接下来就给大家分享一下Jpcap的用法和本人的课程设计程序,也方便日后自己复习。
Jpcap的使用:
1.安装的话网上有很多教程,这里就不做说明了,大家直接百度吧,要说的一点是64位和32位的主机是用的dll文件是不同的(至少32位不能用在64位上),在调整好这个问题之后,我自己的主机上还出现了一个问题,自己的机器是64位的,用实验室的32位主机可以完美运行的程序放到我的主机上就会报出如下的错误:
java.lang.NoSuchMethodError:setRoutingOption
at jpcap.JpcapCaptor.nativeOpenLive(NativeMethod)
at jpcap.JpcapCaptor.openDevice(JpcapCaptor.java:68)
其实我到现在还没解决这个问题,网上找了很多,说是配置的方法问题,但我确实是按照正确方法来的,还是会抛出这个异常,不过这个异常完全不会影响程序的运行(32位无异常完美运行)所以大家有相同问题的能解决就解决,不能解决的无视算了,貌似没影响的说。但是如果抛出了其他异常的话八成是dll文件的问题,还有就是Jpcap需要安装Winpcap软件才能用,一切弄好之后就可以使用了。
2.抓包和解析需要用到的方法和类并不多,所有的类包含于下面两个包中:
import jpcap.*;
import jpcap.packet.*;
下面就介绍一下抓包程序中用到的一些关键性方法:
1.NetworkInterface[] devices =JpcapCaptor.getDeviceList();
//获取网卡信息,主机中有几个网卡NetworkInterface数组就会获取几个元素
2.captor =JpcapCaptor.openDevice(devices[0],2000, true, 3000);
//开启网卡进行准备进行抓包,第一个参数是所选网卡,第二个参数为数据报最大长度,第三个参数为是否设置为混杂模式,第四个参数为最长等待时间。
3.captor.setFilter("ip", true);
//设置过滤器,若不进行设置则获取所有网卡抓获的数据包,此句意思为设置为只抓取IP数据包。
4.IPPacket ip = (IPPacket) captor.getPacket();
//获取一个数据包并转换成IP数据包类,因为getPacket()返回的是一个Packet类型,所以需要进行强制类型转换后进行解析。
5.ip.protocol
//接下来解析就很容易了,IPPacket类已经将我们需要解析的信息都已经封装好了,直接用据点运算符一个个获取然后转换类型显示就行了。如果想获取到更多的信息则可以再确认IP数据包的协议类型之后在进行ICMPPacket,TCPPacket,UDPPacket的转换然后获取相应的解析信息
6.EthernetPacket datalink = (EthernetPacket) ip.datalink;
//如果想获取下层信息也是可以的,利用这条语句可以直接获取到数据包数据链路层的相关信息并进行解析。
注:Jpcap中还有许多对数据包包操作的类与方法,由于抓包用不上就不列出来了,有兴趣可以下载帮助文档查看(后面有打包可下载)。
3.抓包代码如下(解析代码和界面代码放在一个类中,抓包类中只有一些静态方法):
import java.io.IOException;
import jpcap.*;
import jpcap.packet.*;
public class IPCaptor {
private static JpcapCaptor captor = null;
public static void open() throws IOException {
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
captor = JpcapCaptor.openDevice(devices[0], 2000, true, 3000);
}
public static void setFilterType(int type) throws IOException {
switch (type) {
case 0:
captor.setFilter("ip", true);
break;
case 1:
captor.setFilter("tcp", true);
break;
case 2:
captor.setFilter("udp", true);
break;
case 3:
captor.setFilter("icmp", true);
break;
}
}
public static IPPacket cap(){
IPPacket ip = null;
while (true) { //循环直到抓到一个包
ip = (IPPacket) captor.getPacket();
if (ip != null) {
return ip;
}
}
}
}
简单的界面设计:
GUI编程在这里就不多说了,程序运行如下:
如果有兴趣的话可以下载后面的压缩包参考一下代码,代码略长就不贴出来了直接一并打包了,当然需要Jpcap32位64位、Jpcap文档、或者网络课程设计报告的都可以下载后面那个压缩包,都一并打包放这里了,需要请戳这里。