JMeter Websocket 二进制Binary压力测试或接口测试

背景

最近在做游戏项目,做好java服务端,需要本地调试Websock服务,并且是二进制binary形式传输,网上的很多都是text形式传输的测试页面,所以不符合要求。为了解决websocket的二进制传输,并实现websocket通信机制的心跳问题,所以写了一个做法。

目的

  1. Jmeter与java后端websocket服务建立连接
  2. 因为websocket机制,有定时检测连接是否存储,所以需要Jmeter定时维护连接存在,不然超过心跳时间会断开连接。
  3. 建立连接后,二进制传输

操作

1. 下载Jmeter

https://jmeter.apache.org/download_jmeter.cgi 上官网,找最新的版本,找到zip格式的压缩文件,便于在windows下解压。 解压后,找到bin目录下的jmeter.bat文件,则会启动Jmeter

2. 更改语言

点击菜单栏-option-language-Chinese,则能显示中文 1.png

3. 下载Jmeter的Websocket插件

https://bitbucket.org/pjtr/jmeter-websocket-samplers/src 下载后,放到jmeter目录的lib\ext下,并重启jmeter

如: D:\Program Files\apache-jmeter-5.2.1\lib\ext\

4. 建立线程组

1.png 我这里是自测,所以用了一次循环 2.png

5. 建立 websocket写入 样例

对着 线程组右键-》添加-》取样器-》 websocket simple write sample

5.1 创建连接

填写ip 、端口、连接的path。

说明一下而这个只是对服务端创建连接,并不是真正的通信传输数据用。websocket都是创建连接后,后续才真正的传输通信,如:聊天室建立房间后续再通信。

3.png

5.2 创建 察看结果树

用于看每次通信是否有成功连接。 对着样例右键-》添加-》监听器-》察看结果树

6. 创建真正通信用的websocket写样例

同样在一个线程组下,创建websocket写样例。但是这个时候不需要填写ip和端口,只需要选择已存在的一个连接就行。 4.png

6.1 填写与传输二进制

这个地方就比较麻烦,不能直接填json什么的,只能把对象写好,然后转换为byte数组,再转为16进制的数字放进jmeter。 5.png

我这两个类呢,是个protobuf软件proto.exe生成出来的类来的,里面有转换为toByteArray方法,得到二进制数组后,再写个工具把刚刚的数组转换为16进制,就得出结果。 6.png

执行后,打印出来后,得到这个数字就可以放进jmeter的参数栏。参数类型,记得选binary


到这里基本上就完成了。为了压测时,我们需要对websocket后端进行心跳维护。

7. 最后弄弄定时心跳

对着线程组右键-》添加-》逻辑控制器-》runningtime控制器 7.png

填好这个定时任务存活时间

7.1 创建心跳传输内容

如同第6点 那样,创建websocket写样例,传输二进制数据。

7.2 创建固定定时器

填写这个定时器,每多少秒执行一次。 8.png

本文到这里就结束了。本次讲解的是websocket的开发自测,可能对于大部分java开发来讲都用不上,只有游戏的同学会使用websocket,搞游戏、聊天室、websocket等项目的同学打个call吧。


欢迎关注公众号,文章更快一步

我的公众号 :地藏思维

image

掘金:地藏Kelvin

简书:地藏Kelvin

我的Gitee: 地藏Kelvin https://gitee.com/kelvin-cai

### 如何在JMeter中对WebSocket进行二进制解码 对于希望利用JMeter测试工具来进行WebSocket性能测试并涉及二进制数据交互的情况,可以通过特定配置实现对二进制消息的支持。由于标准版JMeter并不直接支持WebSocket协议及其特性,因此通常依赖于第三方插件来增强这一功能。 #### 安装必要的组件 为了使JMeter能够处理WebSocket中的二进制数据,建议安装`JMeter WebSocket Samplers by Peter Doornbosch`插件。此插件提供了更丰富的API用于创建复杂的场景模拟,包括发送和接收二进制帧的能力[^3]。 #### 配置采样器以读取二进制响应 一旦上述插件被正确加载到环境中,在构建测试计划时可以选择“WebSocket Binary Request”。该选项允许指定要上传至服务器的数据源路径直接输入字节数组作为请求体的一部分。当接收到服务器返回的消息后,这些信息同样会按照原始格式被捕获下来供后续分析使用。 针对实际应用过程中可能遇到的服务端对接收量级有所限定的情形——即不是一次性接受完整的文件而是分批次获取一定长度的片段——可以在脚本内部加入循环结构控制每轮迭代所提交的内容范围;同时调整监听器设置以便更好地解析来自远端节点反馈过来的信息包。 ```java // 示例代码展示如何定义一个简单的二进制请求 import org.fusesource.mqtt.client.BlockingConnection; ... byte[] fileContent = Files.readAllBytes(Paths.get("path/to/your/file")); // 将本地文件转化为字节数组 for (int i = 0; i < fileContent.length / CHUNK_SIZE + ((fileContent.length % CHUNK_SIZE == 0)? 0 : 1); ++i){ byte[] chunk = Arrays.copyOfRange(fileContent, i * CHUNK_SIZE, Math.min((i + 1) * CHUNK_SIZE, fileContent.length)); // 发送当前切片给目标主机... } ``` 值得注意的是,尽管以上方法适用于大多数情况下的开发需求,但在具体实施前仍需参照官方文档确认版本兼容性和最新特性更新状况。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值