java抓取网卡请求的数据包,我使用了jnetpcap包,现集成到jfinal中如下:
目录:

class:
package com.raiyi.plugin;
import java.util.ArrayList;
import java.util.List;
import org.jnetpcap.Pcap;
import org.jnetpcap.PcapIf;
import com.jfinal.kit.LogKit;
import com.jfinal.plugin.IPlugin;
import com.raiyi.service.PcapPacketHandlerService;
/**
* 抓包插件,是否抓包---抓取哪个网卡的包?????????????最好写成可配置的
*
* @author Nana
*
*/
public class NetPcapPlugin implements IPlugin {
boolean uf = true;
public NetPcapPlugin() {
}
public NetPcapPlugin(boolean useFlag) {
this.uf = useFlag;
}
/**
* 获取第二个网卡的请求包信息
*
* @return
*/
private boolean pcap() {
return pcap(1);
}
/**
* 获取指定网卡的请求包信息
*
* @param d
* @return
*/
@SuppressWarnings("deprecation")
private boolean pcap(int d) {
if (uf) {
try {
List<PcapIf> alldevs = new ArrayList<PcapIf>(); // alldevs用来装载所有的network
// interface card,
StringBuilder errbuf = new StringBuilder(); // 获取错误信息
/***************************************************************************
* 首先我们要来获取系统中的设备列表
**************************************************************************/
int r = Pcap.findAllDevs(alldevs, errbuf);
/**
* 这个方法构造了可以用pcap_open_live()打开的所有网络设备 这个列表中的元素都是 pcap_if_t,
* name 一个指向设备名字的指针; adderess 是一个接口的地址列表的第一个元素的指针; flag
* 一个PCAP_IF_LOOPBACK标记接口是否是loopback的 失败返回-1,成功返回0
*/
if (r == Pcap.NOT_OK || alldevs.isEmpty()) {
// 如果获取失败,或者获取到列表为空,则输出错误信息,退出
LogKit.error("Can't read list of devices, error is " + errbuf.toString());
return false;
}
LogKit.info("Network devices found:");
int i = 0; // 遍历所有的设备
for (PcapIf device : alldevs) {
String description = (device.getDescription() != null) ? device.getDescription()
: "No description available"; // 如果该设备介绍,则输出介绍
LogKit.info("第" + i++ + "个设备名称: " + device.getName() + ", 描述: " + description);
}
PcapIf device = alldevs.get(1); // 这里在测试的时候可以根据你的可用网卡号自主判断
LogKit.info(
"Choosing '" + ((device.getDescription() != null) ? device.getDescription() : device.getName())
+ "' on your behalf:");
/***************************************************************************
* 打开我们选中的设备
**************************************************************************/
int snaplen = 64 * 1024;
int flags = Pcap.MODE_PROMISCUOUS; // capture all packets
int timeout = 10 * 1000; // 10 seconds in millis
Pcap pcap = Pcap.openLive(device.getName(), snaplen, flags, timeout, errbuf);
if (pcap == null) { // 如果获取的pcap是null,则返回相关的错误信息
LogKit.error("Error while opening device for capture: " + errbuf.toString());
return false;
}
/***************************************************************************
*
* 第三步我们创建一个packet handler 处理器来从libpcap loop中接收数据包
**************************************************************************/
PcapPacketHandlerService pphService = new PcapPacketHandlerService();
pcap.loop(-1, pphService, "pack user info");
pcap.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
@Override
public boolean start() {
return pcap();
}
@Override
public boolean stop() {
return false;
}
}package com.raiyi.service;
import org.jnetpcap.packet.PcapPacket;
import org.jnetpcap.packet.PcapPacketHandler;
public class PcapPacketHandlerService implements PcapPacketHandler<String> {
@Override
public void nextPacket(PcapPacket packet, String msg) {
System.out.println(packet);
System.out.println();
System.out.println();
System.out.println();
System.out.println();
System.out.println();
}
}使用到的jar包:
<!-- https://mvnrepository.com/artifact/jnetpcap/jnetpcap --> <dependency> <groupId>jnetpcap</groupId> <artifactId>jnetpcap</artifactId> <version>1.4.r1425-1f</version> </dependency>
注意:只能在window下运行,因为要加载dll动态库,将两个dll文件存放jdk/bin和jre/bin下:


运行结果:
jnetpcap.dll、jnetpcap-pcap100.dll两个文件网上有资源