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两个文件网上有资源