当前位置: 首页 > article >正文

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

在 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 消息测试。

相关文章:

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

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

从索引中排除 Elasticsearch 字段

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

【Android】文件分块上传尝试

【Android】文件分块上传 在完成一个项目时,遇到了需要上传长视频的场景,尽管可以手动限制视频清晰度和视频的码率帧率,但仍然避免不了视频大小过大的问题,且由于服务器原因,网络不太稳定。这个时候想到了可以将文件分…...

超详细Docker教程

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

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

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

hadoop中了解yarm

Hadoop中的YARN(Yet Another Resource Negotiator)是一种新的Hadoop资源管理器,是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度。以下是其相关介绍: 核心思想 将JobTracker的资源管理和作业调度/监控功…...

Android usb网络共享详解

Android usb网络共享详解 文章目录 Android usb网络共享详解一、前言二、USB网络共享使用的前提1、Android设备支持adb 并且打开usb开关2、原生Settings能看到USB网络共享开关3、代码中检测USB网络共享是否支持 三、Settings 中USB网络共享代码的部分代码1、Settings\res\xml\t…...

【数据库知识】Mysql进阶-高可用MHA(Master High Availability)方案

mysql高可用MHA(Master High Availability)方案 集群部署模式下的高可用方案一、高可用架构原理1. 核心组件2. 故障切换流程 二、详细部署步骤 (3节点集群)1. 环境准备2. 节点配置(以 node1 为例)3. 初始化集群4. 部署MySQL Route…...

Web 架构之会话保持深度解析

文章目录 一、引言二、会话保持的基本概念2.1 什么是会话2.2 为什么需要会话保持 三、会话保持的常见实现方式3.1 基于客户端的会话保持3.1.1 Cookie 方式3.1.2 URL 重写方式 3.2 基于服务器端的会话保持3.2.1 负载均衡器会话保持3.2.2 会话共享 四、会话保持可能遇到的问题及解…...

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

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

attention_weights = torch.ones_like(prompt_embedding[:, :, 0]):切片操作获取第二维度,第三维度

attention_weights = torch.ones_like(prompt_embedding[:, :, 0]):切片操作获取第1 维度,第二维度 attention_weights = torch.ones_like(prompt_embedding[:, :, 0]) 这行代码的作用是创建一个与 prompt_embedding[:, :, 0] 形状相同且所有元素都为 1 的张量,它用于初始化…...

Rust入门之高级Trait

Rust入门之高级Trait - 本文源码 引言 前面学习了迭代器(Iterators),Iterator源码中就用到了关联类型的功能。关联类型就属于高级trait的内容,这次我们学习一下高级trait,了解关联类型等知识。关联类型看似和泛型相…...

从 Set、Map 到 WeakSet、WeakMap 的进阶之旅

在 ES5 时代,JavaScript 的数据结构主要依赖于两种类型:数组和对象。然而,随着应用规模的增长和复杂性上升,传统的数据结构越来越难以满足开发需求。比如,需要一个能自动去重的集合、一个支持任意类型键名的字典、一个…...

TTL (Time-To-Live) 解析

文章目录 TTL (Time-To-Live) 解析:网络与Java中的应用一、TTL的定义二、TTL在网络中的应用1. **路由和数据包的生命周期**2. **DNS中的TTL**3. **防止环路** 三、TTL在Java中的应用1. **缓存管理**2. **Java中的ThreadLocal**3. **网络通信中的TTL** 四、TTL的注意…...

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 构建数据集、训练模型并优化库以…...

web 自动化之 yaml 数据/日志/截图

文章目录 一、yaml 数据获取二、日志获取三、截图 一、yaml 数据获取 需要安装 PyYAML 库 import yaml import os from TestPOM.common import dir_config as Dir import jsonpathclass Data:def __init__(self,keyNone,file_name"test_datas.yaml"):file_path os…...

ARMV8 RK3399 u-boot TPL启动流程分析 --start.S

上电后运行的第一支文件&#xff1a;arch/arm/cpu/armv8/start.S CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK1 #include <asm/arch/boot0.h> 跳转到 arch/arm/include/asm/arch-rockchip/boot0.h CONFIG_SPL_BUILD1 b 1f ROCKCHIP_EARLYRETURN_TO_BROMno TINY_FRAMEWORKno …...

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

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

使用termius连接腾讯云服务器

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

redis 命令大全整理

http://doc.redisfans.com/ 原网址 Redis 命令分类 Key(键) Key(键)命令 exists/del/keys/type/scanobject/move/dump/migratettl/pttl/persist/expireat/pexpireat/expire/pexpirerename/renamenxsort/randomkey/restoreexists 语法:exists key [key ...] 检查一个或多…...

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

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

Mac M系列 安装 jadx-gui

安装 Homebrew在终端中执行以下命令&#xff08;需管理员密码&#xff09;&#xff1a; 安装 Homebrew&#xff08;官方源&#xff09; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"国内用户可用镜像源加速&…...

软考 系统架构设计师系列知识点之杂项集萃(56)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;55&#xff09; 第91题 商业智能关注如何从业务数据中提取有用的信息&#xff0c;然后采用这些信息指导企业的业务开展。商业智能系统主要包括数据预处理、建立&#xff08;&#xff09;、数据分…...

Ubuntu20.04 搭建Kubernetes 1.28版本集群

环境依赖 以下操作,无特殊说明,所有节点都需要执行 安装 ssh 服务安装 openssh-server复制代码 sudo apt-get install openssh-server修改配置文件复制代码 vim /etc/ssh/sshd_config找到配置项 复制代码 LoginGraceTime 120 PermitRootLogin prohibit-password StrictModes…...

【Linux】基础指令(Ⅱ)

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

RAG之大规模解析 PDF 文档全流程实战

PDF 文档在商业、学术和政府领域无处不在,蕴含着大量宝贵信息。然而,从 PDF 中提取结构化数据却面临着独特的挑战,尤其是在处理数千甚至数百万个文档时。本指南探讨了大规模解析 PDF 的策略和工具。 PDF解析挑战 PDF 的设计初衷是为了提供一致的视觉呈现,而非数据提取。这…...

vue-ganttastic甘特图label标签横向滚动固定方法

这个甘特图之前插件里&#xff0c;没有找到能固定label标签在屏幕上的办法&#xff0c;用css各种办法都没有实现&#xff0c;所以我我直接手写定位&#xff0c;用js监听滚动条滚动的距离&#xff0c;然后同步移动甘特图label标签&#xff0c;造成一种定位的错觉&#xff0c;以下…...

AcroForm JavaScript Promise 对象应用示例: 异步加载PDF文件

这段代码演示了在Adobe Acrobat DC Pro 的 JavaScript 环境中如何使用 Promise 对象处理异步操作。具体功能是&#xff1a; 定义了一个loadFile函数&#xff0c;模拟异步加载PDF文件的操作使用Promise对象封装异步操作&#xff0c;提供成功(resolve)和失败(reject)两种状态通过…...