JMeter 中通过 WebSocket (WS) 协议发送和接收 Protocol Buffers (Proto) 消息

news2025/5/15 19:54:39

在 JMeter 中通过 WebSocket (WS) 协议发送和接收 Protocol Buffers (Proto) 消息,需要使用 JMeter WebSocket 插件,并结合 JSR223 脚本处理 Proto 的序列化和反序列化。以下是完整步骤:


1. 准备工作

1.1 安装 WebSocket 插件
  • 下载插件:
    JMeter WebSocket Samplers(推荐使用 WebSocket Samplers by Maciej Zaleski

  • 将插件的 JAR 文件放入 JMeter 的 lib/ext 目录,重启 JMeter。

1.2 添加 Protocol Buffers 依赖
  • 将 protobuf-java-x.x.x.jar 放入 JMeter 的 lib 目录(与之前步骤一致)。

1.3 生成 Proto Java 类
  • 使用 protoc 生成 Java 类(与之前步骤一致)。


2. 发送 Proto 消息(WebSocket)

2.1 配置 WebSocket 连接
  1. WebSocket Open Connection

    • 配置 WebSocket 服务器地址(如 ws://your-server:port/endpoint)。

    • 设置连接超时和消息超时。

  2. WebSocket Request-Response Sampler

    • 用于发送消息并等待响应(同步模式)。

2.2 使用 JSR223 脚本发送 Proto 消息

在 WebSocket Request-Response Sampler 中,使用 JSR223 PreProcessor 生成 Proto 二进制数据:

import com.your.package.RequestProtoMessage;

// 1. 构建 Proto 对象
def request = RequestProtoMessage.newBuilder()
    .setField1("value1")
    .setField2(123)
    .build();

// 2. 序列化为字节数组
byte[] payload = request.toByteArray();

// 3. 将字节数组设置为 WebSocket 请求内容
vars.putObject("wsRequestPayload", payload);
 

在 WebSocket Request-Response Sampler 中配置

  • Request Data${__byteToString(${vars.getObject("wsRequestPayload")}, "ISO-8859-1")}
    (将二进制转换为字符串,确保不丢失数据)

  • Message TypeBinary(必须选择二进制消息类型).


3. 接收 Proto 消息(WebSocket)

3.1 使用 JSR223 PostProcessor 解析响应

在 WebSocket Request-Response Sampler 后添加 JSR223 PostProcessor

import com.your.package.ResponseProtoMessage;

// 1. 获取 WebSocket 响应(二进制格式)
byte[] responseBytes = prev.getResponseData() as byte[];

if (responseBytes == null || responseBytes.length == 0) {
    throw new Exception("WebSocket 响应为空!");
}

try {
    // 2. 反序列化 Proto 对象
    ResponseProtoMessage response = ResponseProtoMessage.parseFrom(responseBytes);

    // 3. 提取字段到 JMeter 变量
    vars.put("responseStatus", response.getStatus().toString());
    vars.put("responseData", response.getData().toString());

    // 4. 断言示例
    if (response.getStatus() != 200) {
        AssertionResult.setFailure(true);
        AssertionResult.setFailureMessage("状态码非 200");
    }

} catch (Exception e) {
    log.error("解析 Proto 响应失败: " + e.getMessage());
    throw e;
}
 

4. 完整测试计划示例

  1. 线程组
    └─ WebSocket Open Connection(建立连接)
    └─ WebSocket Request-Response Sampler
    ├─ JSR223 PreProcessor(生成 Proto 请求)
    └─ JSR223 PostProcessor(解析 Proto 响应)
    └─ WebSocket Close Connection(关闭连接)


5. 关键注意事项

5.1 WebSocket 消息类型
  • 必须选择 Binary 消息类型(Proto 消息为二进制格式)。

  • 文本消息类型可能导致数据损坏。

5.2 异步消息处理
  • 如果服务端主动推送消息(非请求-响应模式),使用 WebSocket Single Read Sampler 监听消息。

  • 示例配置:

    // WebSocket Single Read Sampler 的 JSR223 PostProcessor
    byte[] asyncResponse = prev.getResponseData() as byte[];
    if (asyncResponse != null) {
        ResponseProtoMessage asyncMsg = ResponseProtoMessage.parseFrom(asyncResponse);
        log.info("收到异步消息: " + asyncMsg.toString());
    }
     
5.3 性能优化
  • 复用 WebSocket 连接(避免重复握手)。

  • 在 WebSocket Open Connection 中勾选 Re-use connection

  • 使用 Groovy 语言并启用脚本缓存。


6. 调试技巧

6.1 日志记录

// 记录 Proto 请求内容(Base64 编码方便查看)
import java.util.Base64;
String requestBase64 = Base64.getEncoder().encodeToString(payload);
log.info("Proto 请求内容 (Base64): " + requestBase64);
 
6.2 保存二进制响应到文件

new FileOutputStream("/tmp/websocket_response.bin").write(responseBytes);
 
6.3 模拟二进制消息
  • 使用 __FileToString 函数加载本地 Proto 文件:

    byte[] filePayload = FileInputStream.readAllBytes(new File("/path/to/request.bin"));
    vars.putObject("wsRequestPayload", filePayload);
     

7. 常见错误

  1. ClassNotFoundException: com.your.package.XXXProto

    • 检查 Proto 生成的 Java 类是否在 classpath 中(JAR 文件位置正确)。

  2. WebSocket 连接失败

    • 确认服务器地址和端口是否支持 WebSocket。

    • 检查防火墙或代理设置。

  3. 消息解析失败

    • 确认客户端和服务端的 .proto 文件版本一致。

    • 检查消息类型是否为 Binary


通过以上步骤,可以在 JMeter 中实现基于 WebSocket 的 Protocol Buffers 消息测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2376328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从索引中排除 Elasticsearch 字段

作者:来自 Elastic Kofi Bartlett 说明如何配置 Elasticsearch 排除字段、为什么要这样做,以及应遵循的最佳实践。 更多阅读:Elasticsearch:inverted index,doc_values 及 source 想获得 Elastic 认证?了解…

超详细Docker教程

前言:大家在在Linux上部署mysql及其他软件时,大家想一想自己最大的感受是什么? 我相信,除了个别天赋异禀的人以外,大多数人都会有相同的感受,那就是麻烦。核心体现在三点: 命令太多了&#xff…

Java项目拷打(外卖+点评)

一、点评星球(黑马点评) 1、项目概述 1.1、项目简介 本项目是基于Spring Boot与Redis深度整合的前后端分离的点评平台。系统以Redis为核心技术支撑,重点解决高并发场景下的缓存穿透、击穿、雪崩等问题,涵盖商户展示、优惠券秒杀…

微信小程序仿淘宝拍照/照片点位识图、点位裁剪生图、图片裁剪组件、图片点位框选、裁剪生成图片,canvasToImg

实现效果 效果: 1.微信小程序仿淘宝拍照/照片点位识图、根据点位裁剪生图、图片可裁剪、图片高度可控 2.识别点位自动生成标准构图方案,支持手动微调实现像素级精准裁剪 3.可以根据接口识别的点位信息实现拍照/相册图片特征点自动识别并裁剪 实现步骤 …

Qt/C++开发监控GB28181系统/录像文件查询/录像回放/倍速播放/录像文件下载

一、前言 搞定了实时预览后,另一个功能就是录像回放,录像回放和视频点播功能完全一致,唯一的区别就是发送点播的sdp信息中携带了开始时间和结束时间,因为是录像文件,所以有这个时间,而实时视频预览这个对应…

季报中的FPGA行业:U型反转,春江水暖

上周Lattice,AMD两大厂商相继发布2025 Q1季报,尽管恢复速度各异,但同时传递出FPGA行业整体回暖的复苏信号。 5月5日,Lattice交出了“勉强及格”的答卷,报告季度营收1亿2000万,与华尔街的预期基本相符。 对于这家聚焦在中小规模器件的领先厂商而言,按照其CEO的预期,长…

嵌入式机器学习平台Edge Impulse图像分类 – 快速入门

陈拓 2025/05/08-2025/05/11 1. 简介 官方网址 https://edgeimpulse.com/ 适用于任何边缘设备的人工智能: Gateways - 网关 Sensors & Cameras - 传感器和摄像头 Docker Containers - Docker容器 MCUs, NPUs, CPUs, GPUs 构建数据集、训练模型并优化库以…

zst-2001 上午题-历年真题 计算机网络(16个内容)

网络设备 计算机网络 - 第1题 ac 计算机网络 - 第2题 d 计算机网络 - 第3题 集线器不能隔离广播域和冲突域,所以集线器就1个广播域和冲突域 交换机就是那么的炫,可以隔离冲突域,有4给冲突域,但不能隔离广播域&#xf…

使用termius连接腾讯云服务器

使用termius连接腾讯云服务器 1.下载termius termius官网 安装配置教程 这里安装的window版本> 默认安装到C盘,不建议修改路径 可以选择谷歌登录,也可以不登录,软件是免费的,试用的是付费版本,不需要点 2.配置 这里…

实景三维建模软件应用场景(众趣科技实景三维建模)

实景三维建模软件应用场景概述 实景三维建模软件,作为数字化时代的重要工具,不仅能够真实、立体、时序化地反映和表达物理世界,还为国家的基础设施建设和数字化发展提供了有力的支撑。 在测绘与地理信息领域,实景三维建模软件是构…

【Linux】基础指令(Ⅱ)

目录 1. mv指令 2. cat指令 3.echo指令 补:输出重定向 4. more指令 5. less指令 6. head指令和tail指令 7.date指令 时间戳: 8. cal指令 9. alias指令 10.grep指令 1. mv指令 语法:mv [选项]... 源文件/目录 目标文件/目录 …

【ios越狱包安装失败?uniapp导出ipa文件如何安装到苹果手机】苹果IOS直接安装IPA文件

问题场景: 提示:ipa是用于苹果设备安装的软件包资源 设备:iphone 13(未越狱) 安装包类型:ipa包 调试工具:hbuilderx 问题描述 提要:ios包无法安装 uniapp导出ios包无法安装 相信有小伙伴跟我一样&…

【嵌入模型与向量数据库】

目录 一、什么是向量? 二、为什么需要向量数据库? 三、向量数据库的特点 四、常见的向量数据库产品 FAISS 支持的索引类型 vs 相似度 五、常见向量相似度方法对比 六、应该用哪种 七、向量数据库的核心逻辑 🔍 示例任务:…

【东枫科技】使用LabVIEW进行NVIDIA CUDA GPU 开发

文章目录 工具包 CuLab - LabVIEW 的 GPU 工具包特性和功能功能亮点类似 LabVIEW 的 GPU 代码开发支持的功能数值类型和维数开发系统要求授权售价 工具包 CuLab - LabVIEW 的 GPU 工具包 CuLab 是一款非常直观易用的 LabVIEW 工具包,旨在加速 Nvidia GPU 上的计算密…

基于策略的强化学习方法之策略梯度(Policy Gradient)详解

在前文中,我们已经深入探讨了Q-Learning、SARSA、DQN这三种基于值函数的强化学习方法。这些方法通过学习状态值函数或动作值函数来做出决策,从而实现智能体与环境的交互。 策略梯度是一种强化学习算法,它直接对策略进行建模和优化&#xff0c…

1.Redis-key的基本命令

(一)Redis的基本类型 String,List,Set,Hash,Zset 三种特殊类型:geospatial(地理空间数据)、hyperloglog[基数估算(去重计数)]、bitmaps(位图&…

PROFIBUS DP转ModbusTCP网关模块于污水处理系统的成功应用案例解读​

在当今的工业生产领域,众多企业在生产过程中会产生大量工业废水。若这些废水未经处理直接排放,将会引发严重的工业污染问题。因此,借助科技手段对污水进行有效处理显得尤为重要。在一个污水处理系统中,往往包含来自不同厂家、不同…

电脑开机提示按f1原因分析及解决方法(6种解决方法)

经常有网友问到一个问题,我电脑开机后提示按f1怎么解决?不管理是台式电脑,还是笔记本,都有可能会遇到开机需要按F1,才能进入系统的问题,引起这个问题的原因比较多,今天小编在这里给大家列举了比较常见的几种电脑开机提示按f1的解决方法。 电脑开机提示按f1原因分析及解决…

复现:DemoGen 用于数据高效视觉运动策略学习的 合成演示生成 (RSS) 2025

https://github.com/TEA-Lab/DemoGen?tabreadme-ov-file 复现步骤很简单,按照readme配置好conda环境即可运行。 运行: cd demo_generation bash run_gen_demo.sh 等待生成: 查看data文件夹

本地部署firecrawl的两种方式,自托管和源码部署

网上资料很多 AI爬虫黑科技 firecrawl本地部署-CSDN博客 源码部署 前提条件本地安装py,node.js环境,嫌弃麻烦直接使用第二种 使用git或下载压缩包 git clone https://github.com/mendableai/firecrawl.git 设置环境参数 cd /firecrawl/apps/api 复制环境参数 …