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

Jmeter对websocket进行测试

JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar下载

公司使用websocket比较奇怪,需要带认证信息进行长连接,通过websocket插件是请求失败,如下图,后面通过代码实现随再打包jar包完成websocket测试

本地实现代码如下:

package com.fangdd.socket;import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;
import java.net.URI;
import java.net.URISyntaxException;
import java.io.IOException;public class SocketIOExample {public static void main(String[] args) throws URISyntaxException, IOException {IO.Options options = new IO.Options();        options.query="tid=wwwww1231&uid=12352547&ticket=mxLqAgCaq7R";Socket socket = IO.socket(URI.create("http://localhost:9092"), options);socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {@Overridepublic void call(Object... args) {System.out.println("connect");// 如果需要发消息参考此代码 连接成功后发送具有body的自定义事件,公司暂不需要注释此代码
//                JSONObject body = new JSONObject();
//                try {
//                    body.put("message", "Hello, Server!");
//                } catch (JSONException e) {
//                    e.printStackTrace();
//                }
//
//                // 发送事件到服务器--需要与开发确认事件(customEvent)
//                socket.emit("customEvent", body);}});socket.on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() {@Overridepublic void call(Object... args) {System.out.println("connect_error: " + args[0]);}});socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {@Overridepublic void call(Object... args) {System.out.println("disconnect due to: " + args[0]);}});socket.connect();// 监听服务器返回的自定义事件----需要与开发确认监听事件(messageEvent)socket.on("messageEvent", new Emitter.Listener() {@Overridepublic void call(Object... args) {// 处理服务器返回的数据,如果是json需要数据处理//JSONObject response = (JSONObject) args[0];System.out.println("Server response: " + args[0].toString());}});}}

显示如下:

 开发代码打包到lib/ext目录,通过Jmeter对本地方法进行测试,具体实现代码如下:

底层实现代码:


import java.net.URI;
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;public class NomalTools {	public static void  IOsocket(String url,String tid) {IO.Options options = new IO.Options();        options.query="tid="+tid+"&uid=12352547&ticket=mxLqA";Socket socket = IO.socket(URI.create(url), options);socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {@Overridepublic void call(Object... args) {System.out.println("connect");}});socket.on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() {@Overridepublic void call(Object... args) {System.out.println("connect_error: " + args[0]);}});socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {@Overridepublic void call(Object... args) {System.out.println("disconnect due to: " + args[0]);}});socket.connect();// 监听服务器返回的自定义事件socket.on("messageEvent", new Emitter.Listener() {@Overridepublic void call(Object... args) {// 处理服务器返回的数据
//                JSONObject response = (JSONObject) args[0];System.out.println("Server response: " + args[0].toString());}});//10秒后自动关闭连接
//        try {
//			Thread.sleep(10000);
//			System.out.println("10秒自动关闭连接");
//		} catch (InterruptedException e) {
//			e.printStackTrace();
//		}
//        socket.close();}}

Jmeter封装代码:


import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import Common.NomalTools;public class socketTest extends AbstractJavaSamplerClient{private NomalTools nomalTools;private String url;private String tid;private static long start = 0;private static long end = 0;public Arguments getDefaultParameters() {Arguments params = new Arguments();params.addArgument("url", "");params.addArgument("tid", "");return params;}//每个线程测试前执行一次,做一些初始化工作;public void setupTest(JavaSamplerContext arg0) {nomalTools=new  NomalTools();url = arg0.getParameter("url");tid = arg0.getParameter("tid");start = System.currentTimeMillis();}public SampleResult runTest(JavaSamplerContext arg0) {SampleResult sr = new SampleResult();sr.setSamplerData("请求参数num1:"+url+"\n请求参数num2:"+tid);try {sr.sampleStart();// jmeter 开始统计响应时间标记// 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。nomalTools.IOsocket(url, tid);            
//             System.out.println(resultData);sr.setSuccessful(true);} catch (Throwable e) {sr.setSuccessful(false);e.printStackTrace();} finally {sr.sampleEnd();// jmeter 结束统计响应时间标记}return sr;}//测试结束时调用;public void teardownTest(JavaSamplerContext arg0) {end = System.currentTimeMillis();// 总体耗时System.err.println("cost time:" + (end - start) + "毫秒");}public static void main(String[] args) {Arguments params = new Arguments(); params.addArgument("url", "http://localhost:9092");//设置参数,并赋予默认值1 params.addArgument("tid", "qwe123");//设置参数,并赋予默认值2JavaSamplerContext arg0 = new JavaSamplerContext(params); socketTest test = new socketTest(); test.setupTest(arg0); test.runTest(arg0);test.teardownTest(arg0); }
}

集成到Jmeter的效果:

 

 参考文献:

【JMeter】Jmeter进行webSocket接口测试_千重萌的博客-CSDN博客

https://github.com/socketio/socket.io-client-java/blob/main/src/test/java/io/socket/Fiddle.java

相关文章:

Jmeter对websocket进行测试

JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar下载 公司使用websocket比较奇怪,需要带认证信息进行长连接,通过websocket插件是请求失败,如下图,后面通过代码实现随再打包jar包完成websocket测试 本地实现代码如下: pa…...

从2023年世界机器人大会发现机器人新趋势

机器人零部件为何成2023年世界机器人大会关注热门? 在原先,机器人的三大核心零部件是控制系统中的控制器、驱动系统中的伺服电机和机械系统中的精密减速器。如今,机器人的主体框架结构已经落实,更多机器人已经开始深入到各类场景中…...

Kafka单节点部署

🎈 作者:互联网-小啊宇 🎈 简介: CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作,擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…...

生成式AI和大语言模型 Generative AI LLMs

在“使用大型语言模型(LLMs)的生成性AI”中,您将学习生成性AI的基本工作原理,以及如何在实际应用中部署它。 通过参加这门课程,您将学会: 深入了解生成性AI,描述基于LLM的典型生成性AI生命周期中的关键步骤&#xff…...

Obsidian 入门使用手册

文章目录 一、Obsidian 入门1.1 什么是 Obsidian1.2 安装 Obsidian 二、Obsidian 配置2.1 创建第一个笔记2.2 设置界面语言使用中文2.3 主题 三、小结 一、Obsidian 入门 1.1 什么是 Obsidian Obsidian 是一款基于 Markdown 语法编辑的笔记软件。与传统的 Markdown 软件不同的…...

GuLi商城-前端基础Vue指令-单向绑定双向绑定

什么是指令? 指令 (Directives) 是带有 v- 前缀的特殊特性。 指令特性的预期值是:单个 JavaScript 表达式。 指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于DOM 例如我们在入门案例中的 v-on,代表绑定事…...

前端(十三)——JavaScript 闭包的奥秘与高级用法探索

😶博主:小猫娃来啦 😶文章核心:深入理解 JavaScript 中的闭包 文章目录 不理解闭包?这玩意很难?闭包的定义与原理闭包是什么创建一个闭包 闭包的应用场景闭包与作用域闭包与作用域之间的关系全局作用域、函…...

面试-快速学习计算机网络-UDP/TCP

1. OSI四层和七层映射 区别: 应用层,表示层,会话层合并为了应用层数据链路层和物理层合并为了网络接口层 2. TCP和UDP的区别? 总结: 1 . TCP 向上层提供面向连接的可靠服务 ,UDP 向上层提供无连接不可靠服…...

爱校对如何帮助企业和博客主提高在线可见性?

在数字化时代,内容质量已经成为增强在线曝光率的关键因素。企业和博客主经常面临挑战,如何制作高质量、无误的内容以吸引更多的在线用户。此文将详细分析“爱校对”如何帮助用户优化内容,从而提高在线可见性。 1.互联网内容的挑战 搜索引擎…...

MATLAB中xlsread函数用法

目录 语法 说明 示例 将工作表读取到数值矩阵 读取元胞的范围 读取列 请求数值、文本和原始数据 对工作表执行函数 请求自定义输出 局限性 xlsread函数的功能是读取Microsoft Excel 电子表格文件 语法 num xlsread(filename) num xlsread(filename,sheet) num x…...

Prisma.js:JavaScript中的基于代码的ORM

​Prisma是一种流行的用于服务器端JavaScript和TypeScript的数据映射层(ORM)。它的核心目的是简化和自动化数据在存储和应用程序代码之间的传输方式。Prisma支持各种数据存储,并为数据持久化提供了一个强大而灵活的抽象层。通过这个基于代码的…...

解决问题:在cocos create中如何从b文件调用到a文件里用CC.resource.load动态加载的图集

目录 1.在a文件中定义一个公共的变量存储动态加载的图集 2.在a.js中添加一个静态方法,返回动态加载的图集 3.在b.js中使用a.js中定义的静态方法获取图集,并使用它 假设a文件中用CC.resource.load动态加载了一张图集,b文件需要使用这张图集&am…...

分布式 - 消息队列Kafka:Kafka 消费者消费位移的提交方式

文章目录 1. 自动提交消费位移2. 自动提交消费位移存在的问题?3. 手动提交消费位移1. 同步提交消费位移2. 异步提交消费位移3. 同步和异步组合提交消费位移4. 提交特定的消费位移5. 按分区提交消费位移 4. 消费者查找不到消费位移时怎么办?5. 如何从特定…...

如何利用 ChatGPT 进行自动数据清理和预处理

推荐:使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 ChatGPT 已经成为一把可用于多种应用的瑞士军刀,并且有大量的空间将 ChatGPT 集成到数据科学工作流程中。 如果您曾经在真实数据集上训练过机器学习模型,您就会知道数据清理和预…...

PHP“牵手”淘宝商品评论数据采集方法,淘宝API接口申请指南

淘宝天猫商品评论数据接口 API 是开放平台提供的一种 API 接口,它可以帮助开发者获取商品的详细信息,包括商品的标题、描述、图片等信息。在电商平台的开发中,详情接口API是非常常用的 API,因此本文将详细介绍详情接口 API 的使用…...

你更喜欢哪一个:VueJS 还是 ReactJS?

观点列表: 1、如果你想在 HTML 中使用 JS,请使用 Vue; 如果你想在 JS 中使用 HTML,请使用 React。 当然,如果您希望在 JS 中使用 HTML,请将 Vue 与 JSX 结合使用。 2、Svelte:我喜欢它&#…...

PyTorch学习笔记(十六)——利用GPU训练

一、方式一 网络模型、损失函数、数据(包括输入、标注) 找到以上三种变量,调用它们的.cuda(),再返回即可 if torch.cuda.is_available():mynn mynn.cuda() if torch.cuda.is_available():loss_function loss_function.cuda(…...

【实战】十一、看板页面及任务组页面开发(三) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十五)

文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表三、TS 应用:JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…...

金额千位符自定义指令

自定义指令文件 moneyFormat.js /*** v-money 金额千分位转换*/export default {inserted: inputFormatter({// 格式化函数formatter(num, util) {if(num null || num || num undefined || typeof(num) undefined){return }if(util 万元 || util 万){return formatMone…...

请不要用 JSON 作为配置文件,使用JSON做配置文件的缺点

我最近关注到有的项目使用JSON作为配置文件。我觉得这不是个好主意。 这不是JSON的设计目的,因此也不是它擅长的。JSON旨在成为一种“轻量级数据交换格式”,并声称它“易于人类读写”和“易于机器解析和生成”。 作为一种数据交换格式,JSON是…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解

文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...

JavaScript 标签加载

目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...