JMeter 實現 Protobuf 加密解密

一、 .proto文件編譯成.jar文件

相關依賴下載詳見:將 message.proto 編譯成 .jar文件

1.依賴于java編譯環境
2.依賴protoc編譯jar包

編譯目錄

1.創建一個根目錄:protobuf
2.在protobuf下創建buildoutputlibsrc目錄
在這里插入圖片描述
lib:放 protobuf-java-4.31.1.jar
src:放 xxx.proto
在這里插入圖片描述

準備.proto 文件

將準備好的.protp 文件放入src目錄下

syntax = "proto3"; option java_package = "com.message.proto";
option java_outer_classname = "MessageProBuf";package Message;//消息的頭信息
message MessageHead
{string from = 1;string to = 2;string messageId = 3;int32 chatType = 4;}//消息的 body 
message ChatMessage
{MessageHead messageHead=1;string fromUserId = 2;string toUserId= 3;int64 timeSend= 4;int32 type= 5;string content=6;
}

將.proto文件編譯.java 文件

執行命令:

cd .\src\
protoc --java_out=../output message.proto

命令執行完成后,根據.proto 文件中的 java_package、java_outer_classname 生成對應的包目錄和文件名,示例如下:
在這里插入圖片描述
在這里插入圖片描述

使用javac命令將MessageProBuf.java編譯成.class文件

這里依賴protobuf-java-4.31.1.jar 庫,所以需要根目錄下創建一個lib目錄,并將protobuf-java-4.31.1.jar文件放到lib目錄下
在這里插入圖片描述

cd ..\lib\
javac -encoding UTF-8 -cp ".;protobuf-java-4.31.1.jar" -d ..\build ..\output\com\message\proto\MessageProBuf.java 

使用 jar 命令將所有 .class 文件打包成 .jar 文件

cd ..\build\
jar cf message-protobuf.jar com/

在這里插入圖片描述

示例完整命令匯總

:: .proto文件編譯為.java文件
cd .\src\
protoc --java_out=../output message.proto:: .java文件編譯為.class文件
cd ..\lib\
javac -encoding UTF-8 -cp ".;protobuf-java-4.31.1.jar" -d ..\build ..\output\com\message\proto\MessageProBuf.java :: .class文件編譯為.jar包
cd ..\build\
jar cf message-protobuf.jar com/

二、編寫 .groovy文件編譯成.jar文件

相關依賴下載詳見:JMeter groovy 編譯成.jar 文件

編譯目錄

1.創建一個根目錄:groovy
2.在protobuf下創建buildlibsrc目錄
在這里插入圖片描述
lib:放 message-protobuf.jarprotobuf-java-4.31.1.jar 等jar包
src:放 .groovy 文件
在這里插入圖片描述

準備 MessageBuilder.groovy (消息構建文件)

// 導入 .proto 文件中的包名和類名
import com.message.proto.MessageProBuf
java_package :com.message.proto
java_outer_classname:MessageProBuf

import com.message.proto.MessageProBuf  // .proto 中的java_package、java_outer_classname
import com.google.protobuf.MessageLite/*** 消息構建工具類*/
class MessageBuilder {/*** 構建單聊消息* @param fromUserId 發送者ID* @param fromUserName 發送者名稱* @param toUserId 接收者ID* @param toUserName 接收者名稱* @param content 消息內容* @param messageId 消息ID(可選)* @return 構建完成的 MessageLite 對象*/static MessageLite buildChatMessage(String fromUserId, String fromUserName,String toUserId, String toUserName,String content, String messageId = null) {if (messageId == null) {messageId = UUID.randomUUID().toString()}return MessageProBuf.ChatMessage.newBuilder().setMessageHead(MessageProBuf.MessageHead.newBuilder().setFrom("${fromUserId}/pc").setTo(toUserId).setMessageId(messageId).setChatType(1)) // 單聊.setFromUserId(fromUserId).setFromUserName(fromUserName).setToUserId(toUserId).setToUserName(toUserName).setContent(content).setType(1) // 文本消息.setTimeSend(System.currentTimeMillis()).setIsReadDel(false).setIsEncrypt(false).setSeqNo(-1).build()}// ...  構建其他消息類型省略
}

準備 ProtobufParser.groovy (加密解密文件)

import com.message.proto.MessageProBuf
import com.google.protobuf.InvalidProtocolBufferException
import com.google.protobuf.MessageLite
import java.util.function.Function
import org.apache.logging.log4j.LogManager
import org.apache.logging.log4j.Loggerclass ProtobufParser {private static final Logger log = LogManager.getLogger(ProtobufParser::class)// 支持擴展的命令解析映射private static final Map<Integer, Function<byte[], MessageLite>> MESSAGE_PARSERS = new HashMap<>()static {MESSAGE_PARSERS.put(10, { data -> MessageProBuf.ChatMessage.parseFrom(data) });// 更多指令碼和解析函數的映射可以添加到這里}/*** 構建加密后的消息字節數組* @param command 指令碼* @param message Protobuf 消息體* @return 拼接后的字節數組*/static byte[] encryptMessage(int command, MessageLite message) {if (message == null) {throw new IllegalArgumentException("Message cannot be null")}byte[] buffer = message.toByteArray()byte[] bytes = new byte[buffer.length + 1]bytes[0] = (byte) commandSystem.arraycopy(buffer, 0, bytes, 1, buffer.length)return bytes}/*** 解析響應數據中的 Protobuf 消息* @param responseData 響應字節數組數據* @return 解析后的 MessageLite 對象(可擴展)*/static Optional<MessageLite> parseProtobufMessage(byte[] responseData) {if (responseData == null || responseData.length < 1) {throw new IllegalArgumentException("Response data is null or empty")}int command = responseData[0] & 0xFFbyte[] messageData = Arrays.copyOfRange(responseData, 1, responseData.length)try {Function<byte[], MessageLite> parser = MESSAGE_PARSERS.get(command)if (parser != null) {MessageLite message = parser.apply(messageData)log.info("Decoded message: ${message.toString()}")return Optional.of(message)} else {log.warn("Unknown command: $command")return Optional.empty()}} catch (InvalidProtocolBufferException e) {log.error("Failed to parse Protobuf message", e)throw new RuntimeException("Failed to parse Protobuf message with command: $command", e)}}
}

編譯 Groovy 文件為 .class

1、將MessageBuilder.groovy 構件成 MessageBuilder.class 文件到指定的build/message 目錄下
2、將ProtobufParser.groovy 構件成 ProtobufParser.class 文件到指定的build/protobuf 目錄下

:: 切換到目錄
cd groovygroovyc -cp "lib/*" src/MessageBuilder.groovy -d build/messagegroovyc -cp "lib/*" src/ProtobufParser.groovy -d build/protobuf

將目錄build/message 、build/protobuf 目錄下所有的.class 文件分別構建成 .jar文件

:: 切換到目錄
cd groovyjar cf MessageBuilder.jar -C build/message .jar cf ProtobufParser.jar -C build/protobuf .

示例完整命令匯總

PS D:\System\Desktop\csdn> cd groovy
PS D:\System\Desktop\csdn\groovy> groovyc -cp "lib/*" src/MessageBuilder.groovy -d build/message
PS D:\System\Desktop\csdn\groovy> groovyc -cp "lib/*" src/ProtobufParser.groovy -d build/protobuf
PS D:\System\Desktop\csdn\groovy> jar cf MessageBuilder.jar -C build/message .
PS D:\System\Desktop\csdn\groovy> jar cf ProtobufParser.jar -C build/protobuf .
PS D:\System\Desktop\csdn\groovy>

在這里插入圖片描述

三、JMeter 使用加解密

將 protobuf-java-4.31.1.jar 文件復制到 jmeter lib 目錄下

在這里插入圖片描述

將message-protobuf.jar、MessageBuilder.jar、ProtobufParser.jar 三個文件復制到lib/ext 目錄下

在這里插入圖片描述

四、重啟JMeter

五、在JMeter 中使用

在JMeter 中添加線程組

在這里插入圖片描述

在線程組上添加取樣器/JSR223 Sampler

在這里插入圖片描述
在JSR223 Sampler 中的script 腳本添加如下代碼

import com.message.proto.MessageProBuf;
import com.google.protobuf.MessageLite;
import org.apache.logging.log4j.LogManager
import org.apache.logging.log4j.Logger// 創建日志記錄器
Logger logger = LogManager.getLogger("test-protpbuf-jsr223-sampler")// 單聊消息
MessageLite chatMessage = MessageBuilder.buildChatMessage("${fromUserId}","fromUserName","${userId}","toUserName","我是xxx"); // 構建消息體
byte[] chatMessageEncryptedBytes = ProtobufParser.encryptMessage(10,chatMessage); // 加密
logger.info("單聊消息byte: {}", chatMessageEncryptedBytes)
def chatMessageDecrypt = ProtobufParser.parseProtobufMessage(chatMessageEncryptedBytes); // 消息解密

在這里插入圖片描述

設置顯示日志視圖

在這里插入圖片描述

運行測試

在這里插入圖片描述

運行結果

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90154.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90154.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90154.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

發票識別在費控系統應用剖析

一、發票識別與費控系統的融合價值1.1 解決傳統費控痛點效率瓶頸突破&#xff1a;將人工處理每張發票的5-8分鐘縮短至秒級自動識別準確性飛躍&#xff1a;關鍵字段識別準確率從人工的95%提升至99%以上合規性強化&#xff1a;自動對接稅務系統驗真&#xff0c;虛假發票識別率提升…

Rust實戰:決策樹與隨機森林實現

基于 Rust 實現決策樹(Decision Tree)和隨機森林(Random Forest)的實例 Linfa的基本定義 Linfa是意大利語中“淋巴”(lymph)的意思,在醫學領域指淋巴系統相關的結構或功能。淋巴系統由淋巴管、淋巴結、脾臟等組成,負責免疫防御和體液平衡。 Linfa在生物學中的作用 …

9. isaacsim4.2教程-ROS加相機/CLOCK

在本示例中&#xff0c;我們將學習如何&#xff1a; 向場景中添加額外的相機并將其安裝在機器人上 添加相機發布器&#xff08;Camera Publishers&#xff09; 通過 rostopics 發送真實的合成感知數據&#xff08;ground truth synthetic perception data&#xff09; 前提…

微信小程序171~180

1.封裝購物車接口API import http from /utils/httpexport const reqAddCrt ({ goodsId, count, ...data }) > {return http.get(/cart/addToCart/${goodsId}/${count}, data) }export const reqCartList () > {return http.get(/cart/getCartList) }export const reqU…

修改 docker 容器的掛載配置(保持數據不丟的情況)

一、核心原理Docker 容器的運行時配置&#xff08;包括掛載&#xff09;是啟動時確定的&#xff0c;一旦啟動無法直接修改。因此&#xff0c;需通過以下步驟實現&#xff1a;保存原容器中的數據&#xff08;避免丟失&#xff09;&#xff1b;基于原鏡像創建新容器&#xff0c;同…

MVCC(多版本并發控制)介紹及實現原理

一、什么是MVCC&#xff1f; MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并發控制&#xff09;是數據庫中用于解決并發訪問問題的一種機制。它通過為數據維護多個版本&#xff0c;讓讀寫操作在不同版本上獨立進行&#xff0c;從而避免了傳統鎖機制中…

密碼學基礎概念詳解:從古典加密到現代密碼體系

一、引言&#xff1a;為什么我們需要密碼學&#xff1f; 在數字化時代&#xff0c;信息已成為核心生產要素&#xff0c;而信息安全則是保障社會運轉的基石。當我們在電商平臺輸入銀行卡密碼時&#xff0c;當我們通過即時通訊工具發送私密消息時&#xff0c;當企業在云端存儲核心…

小鵬汽車視覺算法面試30問全景精解

小鵬汽車視覺算法面試30問全景精解 ——智能駕駛 車路協同 視覺創新:小鵬汽車視覺算法面試核心考點全覽 前言 小鵬汽車作為中國智能電動汽車的創新引領者,致力于通過AI與自動駕駛技術推動智能出行的變革。小鵬視覺算法團隊深耕自動駕駛感知、車路協同、智能座艙、3D重建…

程序是如何生成的-以c語言為例

一&#xff0c;序言 從代碼到能跑的程序&#xff0c;整個過程就像 “把外文翻譯成母語&#xff0c;再組裝成能直接用的東西”&#xff0c;一步步來更清楚&#xff1a; 源代碼&#xff08;程序員寫的代碼&#xff0c;如C語言文件&#xff09;↓ 預處理&#xff08;處理#開頭的命…

風險識別清單:構建動態化的風險管理體系

在項目管理實踐中&#xff0c;風險識別是確保項目成功的關鍵環節。PMBOK提出的風險提示清單&#xff08;Prompt List&#xff09;為項目團隊提供了一個系統化的思考框架&#xff0c;幫助突破個人經驗局限&#xff0c;實現更全面的風險覆蓋。這一工具的價值不僅在于其提供的標準…

從“點狀用例”到“質量生態”:現代軟件測試的演進、困局與破局

測試的三次范式躍遷業務高速迭代下的四大困局質量工程化&#xff1a;流程、平臺、度量三位一體左移與右移&#xff1a;把缺陷扼殺在搖籃&#xff0c;也把監控鋪到墳墓自動化金字塔的再平衡&#xff1a;UI、API、單元、契約、e2e數據驅動測試&#xff1a;從“拍腦袋”到“科學實…

【C++】繼承和多態擴展學習

目錄 1. 菱形虛擬繼承原理剖析 1.1.虛基表 2. 單繼承和多繼承的虛函數表深入探索 2.1 單繼承虛函數表深入探索 2.2 多繼承虛函數表深入探索 ?編輯 2.3 菱形繼承、菱形虛擬繼承 3. 繼承和多態考察的一些常見問題 1. 菱形虛擬繼承原理剖析 繼承的文章中我們講到C的多繼承…

Visual Studio Code 遠端云服務器開發使用指南

目錄 一、下載安裝 1、官方下載 2、下載加速方案 二、基于Ubuntu系統的開發環境搭建方案 1、開發環境配置 2、云服務器架構 3、工作流程關系 4、總結 三、推薦插件 1、免配置插件 1. Remote-SSH - 遠程登錄Linux服務器 2. C/C - 必備的C/C開發插件 3. C/C Extensi…

技術演進中的開發沉思-41 MFC系列:定制 AppWizard

MFC開發&#xff0c;最為重要的無非就是用“MFC AppWizard” 對話框做開發了&#xff0c;第一次使用感覺像拆收音機的孩子 —— 左邊是項目類型選擇&#xff0c;右邊是一堆打勾的選項&#xff0c;點完 “完成”&#xff0c;屏幕上就冒出了能直接編譯運行的窗口程序。那時還不知…

Libevent(3)之使用教程(2)創建事件

Libevent(3)之使用教程(2)創建事件 Author: Once Day Date: 2025年6月29日 一位熱衷于Linux學習和開發的菜鳥&#xff0c;試圖譜寫一場冒險之旅&#xff0c;也許終點只是一場白日夢… 漫漫長路&#xff0c;有人對你微笑過嘛… 本文檔翻譯于&#xff1a;Fast portable non-bl…

Kotlin 作用域函數 let 的實現原理

Kotlin 中的 let 是一個 標準庫擴展函數&#xff0c;它廣泛用于作用域函數&#xff08;Scope Functions&#xff09;中&#xff0c;尤其適用于對可空對象&#xff08;nullable&#xff09;做非空判斷并執行代碼塊的場景。 示例代碼 val name: String? "123" name?…

從FDTD仿真到光學神經網絡:機器學習在光子器件設計中的前沿應用工坊

FDTD仿真與光學神經網絡的基礎概念 FDTD&#xff08;時域有限差分&#xff09;是一種數值方法&#xff0c;用于求解麥克斯韋方程組&#xff0c;廣泛應用于光子器件設計。光學神經網絡通過光波導、衍射元件等物理結構實現矩陣運算&#xff0c;具有低能耗、高并行的優勢。 機器學…

在Ubutu22系統上面離線安裝Go語言環境【教程】

0.引言 Go語言&#xff08;又稱Golang&#xff09;是Google開發的一種靜態強類型、編譯型、并發型編程語言&#xff0c;由Robert Griesemer、Rob Pike和Ken Thompson于2007年開始設計&#xff0c;2009年正式發布。 1.到官網下載壓縮包 2.從win10系統離線上傳壓縮包給ubuntu22…

CMake實踐:CMake3.30版本之前和之后鏈接boost的方式差異

目錄 1.背景 2.boost引入CMake時機 3.CMake 3.30 之前&#xff08;含 3.29&#xff09;鏈接 Boost 的方式 4.CMake 3.30 及之后鏈接 Boost 的方式 5.CMake3.30后引入Boost的步驟 6.遷移建議&#xff08;3.30 之前 → 3.30 之后&#xff09; 7.CMake 3.30 移除FindBoost的…

告別掛馬風險!PBootCMS完美替代方案BadouCMS

開發企業網站時一直比較喜歡用pbootcms,標簽套用很簡單&#xff0c;使用也方便。 但是pbootcms一直有被掛馬的問題&#xff0c;官方好像也不怎么更新了&#xff01;換過好幾個cms&#xff0c;比如eyoucms、dedecms、帝國等等&#xff0c;感覺都不怎么能用得習慣&#xff0c;還…