依赖下载jnetpcap-winpcap-libpcap
Maven依赖
<!-- jnetpcap抓包 --><dependency><groupId>jnetpcap</groupId><artifactId>jnetpcap</artifactId><version>1.4.r1425-1g</version></dependency>
windows平台开发(部署)依赖:winpcap
下载地址:https://www.winpcap.org/install/
linux-ubuntu平台开发(部署)依赖:libpcap
sudo apt install libpcap0.8
sudo apt install libpcap0.8-dev
获取函数库jnetpcap.dll-jnetpcap.so
以windows为例,我发现很多私信我或者留言我的小伙伴不知道怎么去获取jnetpcap.dll。
程序中引入maven以后,查看该插件的所在地址
直接用压缩文件打开jar包
程序抓取不到数据包,也没报错
原因可能是监控的不是你当前工作的网卡,需要把其他网卡禁用,只留下真正工作的网卡。此外,我尝试用openJDK11来运行,同样存在无法抓取到数据的情况。切换回oracleJDK1.8以后正常。
windows拷贝jnetpcap.dll
如果不拷贝jnetpcap.dll到当前所工作的JDK目录下,将报如下错误
java.lang.UnsatisfiedLinkError: com.slytechs.library.NativeLibrary.dlopen
上述错误是相关的函数库没有拷贝到jdk的bin目录下。现在把jnetpcap.dll拷贝到bin目录下,问题解决,如果你电脑安装了多个JDK,注意查看当前使用的是哪一个JDK,别拷贝错位置。
能获取到网卡,基本就没问题了。
linux-拷贝jnetpcap.so
首先检查JDK,
java -version
输出信息如下,发现没有安装JDK,因此我们安装一个OpenJDK1.8尝试一下,为避免其他权限问题,我们切换到root
sudo -i
ubuntu@VM-24-17-ubuntu:~$ java -version
Command 'java' not found, but can be installed with:
sudo apt install openjdk-11-jre-headless # version 11.0.24+8-1ubuntu3~22.04, or
sudo apt install default-jre # version 2:1.11-72build2
sudo apt install openjdk-17-jre-headless # version 17.0.12+7-1ubuntu2~22.04
sudo apt install openjdk-18-jre-headless # version 18.0.2+9-2~22.04
sudo apt install openjdk-19-jre-headless # version 19.0.2+7-0ubuntu3~22.04
sudo apt install openjdk-21-jre-headless # version 21.0.4+7-1ubuntu2~22.04
sudo apt install openjdk-8-jre-headless # version 8u422-b05-1~22.04
安装完毕默认的openJDK以后,查看下openJDK1.8的位置
root@VM-24-17-ubuntu:~# java -version
openjdk version "1.8.0_422"
OpenJDK Runtime Environment (build 1.8.0_422-8u422-b05-1~22.04-b05)
OpenJDK 64-Bit Server VM (build 25.422-b05, mixed mode)
此时运行程序,我们发现,报了和windows一模一样的错误。windwos我们是没有拷贝jnetpcap.dll,这里的ubantu是没有拷贝jnetpcap.so。
查找安装的jdk1.8所在位置
update-alternatives --display java
下面是输出信息,我们发现安装路径在:/usr/lib/jvm/java-8-openjdk-amd64/
root@VM-24-17-ubuntu:/home/ubuntu# update-alternatives --display java
java - auto mode
link best version is /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
link currently points to /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
link java is /usr/bin/java
slave java.1.gz is /usr/share/man/man1/java.1.gz
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java - priority 1081
slave java.1.gz: /usr/lib/jvm/java-8-openjdk-amd64/jre/man/man1/java.1.gz
需要注意一点,当我把libjnetpcap.so拷贝到bin目录下,却发现bin目录下,没有任何的so文件。
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/
启动也并没有找到函数库
然而在windows下,我们发现,除了我们拷贝的libjnetpcap.dll,还有其他的dll文件。
因此我们不防找一下ubantu上的jdk下的so文件存在那里,它存在哪里,我们就存在哪里
在:/usr/lib/jvm/java-8-openjdk-amd64目录下我们执行
find -name *.so
不然发现,实际上,so文件是在/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/目录下,因此我们把libjnetpcap.so移到这个目录下。然后重新启动程序试试。
如下所示,发现已经能获取到网卡,只是好像抓取数据的时候报错了。由于我使用的是腾讯云的服务器所以出现如下错误,该报错信息是:应用程序试图通过D-Bus进行进程间通信(IPC),但是无法启动或连接到D-Bus会话总线守护进程(dbus-daemon),简单说,就是这个服务器没有显示器。需要分配显示器才能正常工作。
看报错信息是:Failed to get session bus: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11