课程:B站大学
记录使用jmeter完成websocket压测或者python压测websocket


为什么需要 WebSocket?

初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?

答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。

举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。
注意点:http是单向的,过去工程师都是用轮询的方式解决消息的连接,但是非常浪费资源(因为要不断的发起http请求,tcp连接数会变高)

WebSocket 协议

特点:它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话
在这里插入图片描述
协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

ws://example.com:80/some/path

如何发起websocket连接呢?

1、需要GET请求方式u的http请求
2、请求体需要携带upgrade:websocket请求头
示例:
WebSocket 服务端:

import asyncio
import websockets

async def echo(websocket):
    async for message in websocket:
        print(f"收到消息: {message}")
        await websocket.send(f"你发的是: {message}")

async def main():
    async with websockets.serve(echo, "localhost", 8765):
        print("WebSocket 服务已启动 ws://localhost:8765")
        await asyncio.Future()  # 永久运行

asyncio.run(main())

WebSocket 客户端:

import asyncio
import websockets

async def client():
    async with websockets.connect("ws://localhost:8765") as ws:
        await ws.send("你好 WebSocket")
        msg = await ws.recv()
        print(f"服务端回复: {msg}")

asyncio.run(client())

显然用代码的方式也可以完成压测,但是代码本身是不能开多个,会有限制,用jmx文件压测数据更清晰,并且不会受限制
在这里插入图片描述

注意点:为什么必须先启动服务端?
服务端是被动方(等待连接)
客户端是主动方(发起连接)
主动方必须等被动方准备好才能成功

为什么需要心跳机制?

websocket是一种稳定的长连接:
为了保持 WebSocket 稳定的长连接,在连接建立之后,服务器和客户端之间通过心跳包来保持连接状态,以防止连接因为长时间没有数据传输而被切断。‘
一种特殊的数据包(ping和pong)ping发起请求,pong回应请求(server和client均可以发起ping或者pong)
不包含任何实际数据,仅用来维持连接状态
一个空数据帧
定期发送,确保链接仍然有效,避免长时间没有数据传输而被中断

websocket的缺点

不提供加密功能

如果有安全上的需求,需采用其他方式来确保安全性,如:SSL 协议,设置黑白名单

不支持古老的浏览器

不支持 IE10 以前的版本。需要使用 AJAX 或者其他方式来进行替代(已被验证)

实战:启动py服务端的websocket文件,然后本地编写个jmx文件

jmeter本身不支持websocket协议,需要安装websocket的插件
1、安装:jmeter-plugins-manager-1.12.jar到jmeter的lib/ext目录下
2、安装:jmeter-websocket-samplers-1.3.2.jar到jmeter的lib/ext目录下

在这里插入图片描述

jmeter中的websocket元件:

WebSocket Open Connection​ 建立连接:用于初始化与 WebSocket 服务器的连接(类似打电话拨号)。
WebSocket request-response Sampler​ 请求-响应:发送一条消息并等待服务器返回一条消息(类似收发短信,一问一答)。
WebSocket Single Write Sampler​ 单向发送:只发送消息,不等待服务器回复(类似发广播,说完就走)。
WebSocket Single Read Sampler​ 单向接收:只接收服务器发来的消息,不发数据(类似只听不说)。
WebSocket Ping/Pong​ 心跳检测:发送 Ping 帧保持连接活跃,或测试连接是否断开(类似心跳监测)。
WebSocket Close​ 关闭连接:主动断开与服务器的 WebSocket 连接(类似挂电话)。
在这里插入图片描述
连接地址要配置正确,然后就可以编排发送或者接受消息的取样器
在这里插入图片描述
最终服务端websocket启动,jmx是模拟用户端发送消息或者接收服务端消息
在这里插入图片描述

企业级:jmeter之websocket压测实战:

在这里插入图片描述

企业级:python之websocket压测实战:

在这里插入图片描述

websocket压测在企业项目–性能测试中非常常见且高频,加油

实践是检验真理的唯一标准

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐