用python写一个websocket接口,并用jmeter压测websocket接口

WebSocket接口实现(Python)

本示例展示了一个基于asynciowebsockets库的WebSocket服务器,用于处理客户端发送的数学运算请求(加法、减法、乘法)。服务器监听本地8765端口,接收JSON格式请求,并返回计算结果。

python 复制代码
import asyncio
import websockets
import json
from datetime import datetime

async def business_handler(websocket):
    """处理WebSocket客户端连接与业务请求"""
    client_addr = websocket.remote_address
    print(f"\n[{datetime.now()}] 客户端 {client_addr} 已连接")
    
    try:
        # 持续监听客户端消息
        async for message in websocket:
            try:
                req = json.loads(message)  # 解析JSON请求
                
                # 参数校验
                if not all(key in req for key in ["op", "a", "b"]):
                    resp = json.dumps({"code": 400, "msg": "参数缺失(需op/a/b)", "data": None})
                    await websocket.send(resp)
                    print(f"[{datetime.now()}] 客户端 {client_addr} 参数错误: {message}")
                    continue
                
                # 执行数学运算
                op = req["op"]
                a, b = float(req["a"]), float(req["b"])
                if op == "add":
                    result = a + b  # 加法运算 $a + b$
                elif op == "sub":
                    result = a - b  # 减法运算 $a - b$
                elif op == "mul":
                    result = a * b  # 乘法运算 $a \times b$
                else:
                    resp = json.dumps({"code": 400, "msg": f"不支持的操作 {op}(仅支持add/sub/mul)", "data": None})
                    await websocket.send(resp)
                    continue
                
                # 构造成功响应
                resp = json.dumps({
                    "code": 200,
                    "msg": "success",
                    "data": {
                        "op": op, 
                        "a": a, 
                        "b": b, 
                        "result": result, 
                        "timestamp": datetime.now().timestamp()
                    }
                })
                await websocket.send(resp)
                print(f"[{datetime.now()}] 客户端 {client_addr} 处理完成: {req} → 结果 {result}")
            
            except json.JSONDecodeError:
                # JSON解析异常处理
                resp = json.dumps({"code": 400, "msg": "无效JSON格式", "data": None})
                await websocket.send(resp)
                print(f"[{datetime.now()}] 客户端 {client_addr} 无效JSON: {message}")
    
    except websockets.exceptions.ConnectionClosed:
        print(f"[{datetime.now()}] 客户端 {client_addr} 断开连接")

async def main():
    """启动WebSocket服务器"""
    async with websockets.serve(business_handler, "0.0.0.0", 8765):
        print(f"[{datetime.now()}] WebSocket服务器已启动 → ws://localhost:8765")
        await asyncio.Future()  # 永久运行

if __name__ == "__main__":
    asyncio.run(main())
代码优化说明:
  1. 注释增强:添加函数文档字符串,明确功能描述。
  2. 错误处理:细化异常日志,区分参数错误、操作不支持及JSON解析失败。
  3. 日志规范化:时间戳格式统一,输出信息更易读。
  4. 运算描述 :使用行内数学格式标注运算逻辑(如加法 a+ba + ba+b)。

运行WebSocket接口

启动服务器后,可通过客户端工具(如websocat或浏览器WebSocket API)连接至ws://localhost:8765并发送JSON请求。示例请求格式:

json 复制代码
{"op": "add", "a": 5, "b": 3}

服务器响应示例:

json 复制代码
{
  "code": 200,
  "msg": "success",
  "data": {
    "op": "add",
    "a": 5.0,
    "b": 3.0,
    "result": 8.0,
    "timestamp": 1715000000.0
  }
}

运行截图


JMeter压测WebSocket

使用JMeter对WebSocket接口进行压力测试,需配置WebSocket Request-Response Sampler

  1. 添加Sampler

    • 线程组 → 添加 → 取样器 → WebSocket Request-Response Sampler
    • 配置服务器地址:ws://localhost:8765
  2. 参数设置

    • Request Data :填入JSON请求(如{"op": "mul", "a": 2, "b": 4}
    • Response Timeout:建议设置5000ms(可根据网络调整)
    • Message Backlog:保持默认(用于处理异步响应)
  3. 监听结果

    • 添加查看结果树和聚合报告,监控响应时间与成功率。
    • 异常情况(如连接断开)会记录在JMeter日志中。

配置截图

压测建议:
  • 逐步增加线程数(如50→100→200),观察服务器资源占用(CPU/内存)。
  • 验证边界值:例如发送a=1e10, b=1e10测试大数运算稳定性。
  • 使用Response Assertion检查返回的code字段是否为200。
相关推荐
weixin_472183541 小时前
微信小程序使用websocket
websocket·微信小程序·小程序
喜乐boy1 小时前
CV系列——Conda + PyTorch + CUDA + cuDNN + Python 环境无脑安装速查笔记[2025.12]
pytorch·python·conda·cuda·cv
@游子1 小时前
Python学习笔记-Day6
笔记·python·学习
电饭叔1 小时前
Luhn算法与信用卡识别完善《python语言程序设计》2018版--第8章14题利用字符串输入作为一个信用卡号之三
android·python·算法
月光技术杂谈1 小时前
基于Python+Selenium的淘宝商品信息智能采集实践:从浏览器控制到反爬应对
爬虫·python·selenium·自动化·web·电商·淘宝
HsuHeinrich1 小时前
利用表格探索宜居城市
python·数据可视化
过尽漉雪千山2 小时前
Anaconda的虚拟环境下使用清华源镜像安装Pytorch
人工智能·pytorch·python·深度学习·机器学习
碧海银沙音频科技研究院2 小时前
CLIP(对比语言-图像预训练)在长尾图像分类应用
python·深度学习·分类
Dxxyyyy2 小时前
零基础学JAVA--Day41(IO文件流+IO流原理+InputStream+OutputStream)
java·开发语言·python