最近須要作一個本地網絡流量分析的項目,基於 Java 語言,上網查了不少資料,最後利用 Jnetpcap 實現了,這裏作個記錄。java
這裏先列一下我用到的工具以及版本:網絡
Eclipse Version: 2019-06 (4.12.0)工具
JDK Version:12.0.1,2019-04-16oop
WinPcap Version:4.1.3ui
JnetPcap Version:1.4.r1425spa
Java自己不支持底層的網絡操做,須要第三方包利用 JNI 封裝不一樣系統的C庫來提供 Java 上層接口,其餘的一些類庫像JPcap都年久失修了,我這裏就是用 Jnetpcap 實現的。下面是步驟,須要用到的文件我這裏附上連接:code
WinPcap:https://pan.baidu.com/s/1Xu-HAaGSkOR-WriJM4wrBw,提取碼:yti0blog
JnetPcap:https://pan.baidu.com/s/16bfUf8jHIH7osmC7rd0i-w ,提取碼:6pcx接口
JnetPcap開發者文檔:https://pan.baidu.com/s/1O1GDTpTHmtHxMZXo3YXMdQ,提取碼:mg2yip
使用JnetPcap都要在系統中安裝WinPcap,這裏是Windows系統下,Linux下須要就安裝Lipcap,這裏我主要以 Windows 系統來介紹。
WinPcap安裝包上面已經給出,直接下了安裝就行。
這裏使用Jnetpcap我是導入 Jar 包的形式,沒有采用 Maven ,我在添加依賴以後始終顯示在中央倉沒法下載,不知道是哪裏出了問題,後來乾脆就採用麻煩一點的手段,導入 Jar 包,這裏步驟就比較麻煩了。
先把上面連接的JnetPcap下載下來並解壓,接下來進行下面兩步:
(1)、添加 .dll 文件進系統路徑
這裏須要把 jnetpcap.dll 和 jnetpcap.dll 添加進系統路徑中,這裏添加進系統自己的路徑或者 JDK/bin 路徑下均可以,這裏爲了方便,直接把這兩個文件複製到 C:\Windows\System32 下就行。
(2)、在項目中導入 Jar 包
在 Eclipse 裏點擊 File-->New-->Folder ,名稱填 lib ,再把上面解壓後文件中的 jnetpcap.jar 文件複製到剛剛建立的文件夾下。
接下來還有一步,右鍵點擊項目,點擊最下面的 Properties,選中 Java Build Path-->Libraries,注意要點擊 Classpath,不要管上面那個 Modulepath ,要是添加成上面那個運行的時候會一直報 java.lang.NoClassDefFoundError。
點擊Classpath後點擊右邊的 Add JARS ,在裏面找到剛剛的 lib 文件夾下的 jnetpcap.jar 點擊添加就行,成功後應該是下面這樣的。
這樣基本JnetPcap的配置就基本成功了。
3、簡單的使用
這裏我給出幾個使用 JnetPcap 的例子。
獲取設備網卡:
//此方法用於獲取設備上的網卡設施
public static ArrayList<PcapIf> CaptureNet(){ CaptureUtil.flag=false; // 用於存儲搜索到的網卡
ArrayList<PcapIf> alldevs = new ArrayList<PcapIf>(); //取得設備列表
int r = Pcap.findAllDevs(alldevs, errbuf); if (r == Pcap.NOT_OK || alldevs.isEmpty()) { JOptionPane.showMessageDialog(null,errbuf.toString(),"錯誤",JOptionPane.ERROR_MESSAGE); return null; } return alldevs; }
打開選中網卡並捕獲數據包:
//打開選中的設備 int snaplen = Pcap.DEFAULT_SNAPLEN; // 默認長度爲65535
int flags = Pcap.MODE_PROMISCUOUS; // 混雜模式,捕獲全部類型的包
int timeout = 5 * 1000; // 5 seconds in millis
Pcap pcap = Pcap.openLive(device.getName(), snaplen, flags, timeout, errbuf); if (pcap == null) { JOptionPane.showMessageDialog(null,errbuf.toString(),"錯誤",JOptionPane.ERROR_MESSAGE); return; }
開始監聽:
pcap.loop(int cnt, JPacketHandler<T> handler, T user)
固然上面只是一些代碼示例,不是完整的代碼,在以後的博客中會更新完整的代碼。
上面給出了JnetPcap使用文檔的下載連接,有興趣的話最好仍是照着使用文檔來使用。
上面有什麼錯誤還但願你們指正,但願能和你們多交流。
本文系原創,轉載還請註明出處。