测试Websocket建立通信,使用protobuf格式交换数据
接到一个应用测试,应用实现主要使用websocket保持长链接,使用protobuf格式交换数据,用途为发送消息,需要我们测试评估性能,初步评估需要测试长链接数、峰值消息数以及长期运行稳定性
整体需求不难,主要困难是第一次接触websocket和protobuf,同时也没有现成的脚本可以使用,jmeter原生也不支持websocket协议,需要安装插件支持,protobuf格式也需要重新编译大包使用
万里长征第一步,先开发测试脚本,由于目前一直在使用python开发,评估项目的性能要求,不需要严格性能指标,所以直接使用python作为开发语言编写脚本,主要实现脚本如下
入口主文件,mulitprocess.py,多进程发起建立链接
# -*- coding: utf-8 -*-
# @Author : monleylu
# @Time : 2018/7/5 12:22 PM from multiprocessing import Process,Pool
import os
from data import user
from protobufcon import ProtoService
import tnlog,logging def consumer(host,port,username):
logging.error('启动子进程: %s...' % (os.getpid()))
kwargs = {"host": host, "port": port, "username": username }
pro=ProtoService(**kwargs)
pro.startWebsocket() def consumer2(*args,**kwargs):
logging.error('启动子进程: %s...' % (os.getpid()))
pro = ProtoService(**kwargs)
pro.startWebsocket() if __name__ =="__main__":
logging.error('启动主进程 %s.' % os.getpid()) p = Pool(450)
for i in range(450):
#第一种传参数方法
# p.apply_async(consumer, args=("11.31.60.10",8880,user.pop(),)) #第二种传参数方法
kw={"host": "11.31.60.10", "port": 8880, "username": user.pop()}
p.apply_async(consumer, args=(),kwds=kw) logging.error('Waiting for all subprocesses done...') p.close()
p.join()
logging.error('All subprocesses done.')
实现代码,protobuffun.py,主要负责发送、接收消息
# -*- coding: utf-8 -*-
# @Author : monleylu
# @Time : 2018/7/5 12:15 PM import protoinfo.msg_pb2 as msgpb2
import websocket,json,datetime
import json
try:
import thread
except ImportError:
import _thread as thread
import tnlog,logging
from data import user
class ProtoService: def __init__(self,*,host="10.30.66.11",port=8886,username="monleylu"):
self.host=host
self.port=port
self.username=username def on_message(self,ws, message):
msg2 = msgpb2.Msg()
msg2.ParseFromString(message)
logging.error("用户:{} 收到消息,类型:{},内容:{}".format(self.username,msg2.method,msg2.data))
if msg2.method == "login":
b=msg2.data
c=json.loads(b)
self.sendprotobuf(ws,"serve_get",{'uc_id':c["uc_id"],'boxReadFlag':'','boxArriveFlag':'','boxCollectFlag':''}) def on_error(self,ws, error):
logging.error("发生异常:{}".format(error)) def on_close(self,ws):
ws.close()
logging.error("### closed ###") # def wrapp(username):
# def w(*args,**kwargs): def on_open(self,ws):
self.sendprotobuf(ws, "connect", {'uc_name': self.username}) def sendprotobuf(self,ws,method,data):
msg = msgpb2.Msg()
msg.method = method
msg.data = json.dumps(data)
ws.send(msg.SerializeToString())
logging.error("发送消息,类型:{},内容:{}".format(msg.method, msg.data)) def startWebsocket(self):
# websocket.enableTrace(True)
logging.error("连接服务器:{},端口:{},用户名:{}".format(self.host,self.port,self.username))
ws = websocket.WebSocketApp("ws://{}:{}".format(self.host,self.port),
on_message=self.on_message,
on_error=self.on_error,
on_close=self.on_close)
ws.on_open = self.on_open # ws.run_forever(ping_interval=5)
logging.error(datetime.datetime.now())
ws.run_forever(ping_interval=5)
# ws.run_forever()
logging.error(datetime.datetime.now()) #10.30.66.11 if __name__ == "__main__":
kwargs = {"host": "10.30.66.11", "port": 8886, "username": "liangyuanfang", }
p=ProtoService(**kwargs)
p.startWebsocket()
查询运行过程中,会把日志写到对应的文件中,通过统计文件内容分析测试结果
这里可能各位也注意到写日志,代码使用了error级别,因为之前在调试时,info或者debug级别也会打印出一些引用组建的调试代码,通过这种方式规避下
测试Websocket建立通信,使用protobuf格式交换数据的更多相关文章
- jmeter 测试websocket接口(一)
jmeter 测试websocket接口时,需要对jmeter添加测试websocket的jar包. 下载地址: https://download.csdn.net/download/qq_14913 ...
- SpringBoot使用protobuf格式的接口
SpringBoot使用protobuf格式的接口 建立SpringBoot项目,pom.xml内容如下: <?xml version="1.0" encoding=&quo ...
- 『动善时』JMeter基础 — 50、使用JMeter测试WebSocket接口
目录 1.什么是WebSocket接口 2.为什么需要WebSocket 3.测试WebService接口前的准备 4.WebSocket Sampler组件界面详解 5.使用JMeter测试WebS ...
- [Openfire]使用WebSocket建立Openfire的客户端
近日工作闲暇之余,对IM系统产生了兴趣,转而研究了IM的内容.找了半天,知道比较流行的是Openfire的系统,Openfire有许多平台实现,由于我是做Web的,所以当然是希望寻找Web的实现.Op ...
- 比起 JSON 更方便、更快速、更簡短的 Protobuf 格式
Protocol Buffers 是由 Google 所推出的一格式(後台真硬),你可以把它想像成是 XML 或 JSON 格式,但是更小.更快,而且更簡潔.這能夠幫你節省網路與硬體資源,且你只需要定 ...
- Spring Boot WebFlux-08——WebFlux 中 WebSocket 实现通信
第08课:WebFlux 中 WebSocket 实现通信 前言 WebFlux 该模块中包含了对反应式 HTTP.服务器推送事件和 WebSocket 的客户端和服务器端的支持.这里我们简单实践下 ...
- windows azure中国 里面建立一个虚拟机,与虚拟机建立通信 里面部署IIS,外网访问
在windows azure中国 里面建立一个虚拟机,里面部署IIS,外网不能访问么? 外网访问的地址是给的那个DNS地址 ,比如我的是 DNS 名称 urbanairserver.cloudapp. ...
- JMeter怎样测试WebSocket
一.安装WebSocket取样器 1.从JMeter插件管理器官网下载: https://jmeter-plugins.org/ 把这6个jar包放到C:\JMeter\apache-jmeter-3 ...
- c# 使用protobuf格式操作 Redis
protobuf格式介绍 1.protobuf为goole定义的类似于json的数据格式.2.最终都需要序列化为二进制形式进行传输存储.3.相对于xml,json格式来说,序列化为二进制后占用空间更小 ...
随机推荐
- 【转】如何开发自己的HttpServer-NanoHttpd源码解读
现在作为一个开发人员,http server相关的内容已经是无论如何都要了解的知识了.用curl发一个请求,配置一下apache,部署一个web server对我们来说都不是很难,但要想搞清楚这些背后 ...
- SpringBoot+MyBatis中自动根据@Table注解和@Column注解生成ResultMap
其实我一点都不想用mybatis,好多地方得自己写,比如这里. 使用mybatis要写大量的xml,烦的一批.最烦人的莫过于写各种resultmap,就是数据库字段和实体属性做映射.我认为这里应该是m ...
- Freeze partial parameters while training
1. requires_grad = False Set all parameters in the current model frozen: for p in self.parameters(): ...
- ASP.Net GridView 基础
SP.NET 在开发过程中经常使用的微软提供的服务器控件(GridView),但在开发中很少使用界面化来操作.导致了有点不太会使用界面化操作了,还有就是一些不经常使用的属性也没什么印象了,在网上找了好 ...
- font-failmly字体对应
- SQL Server 数据库每个表占用的空间、大小
查看MSSQL数据库每个表占用的空间大小 sp_spaceused显示行数.保留的磁盘空间以及当前数据库中的表所使用的磁盘空间,或显示由整个数据库保留和使用的磁盘空间. 语法sp_spaceused ...
- Notes 20180507 : Java程序设计之环境搭建与HelloWord
3 HelloWorld 不管从事什么工作那么一个工作环境总是必不可少的,那怕你只是要写篇文章,一张平坦的书桌和流利的书写笔总是能帮助我们完成工作的,Java开发更是如此.在开始今天的HelloWor ...
- Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介
约定 还记得上版本的第二十四篇的约定嘛?现在出来履行啦~ 为什么要重制? 之前写的专栏都是按照心情写的,在最初的时候笔者什么都不懂,而且文章的发布是按照很随性的一个顺序.结果就是说,大家都看完了,都还 ...
- python3>日期和时间
阅读目录 1.python3日期和时间 2.时间元组 3.获取格式化的时间 4.格式化日期 5.获取月日历 6.Time模块 7.datetime模块 回到顶部 1.python3日期和时间 Pyth ...
- 大数据学习:Spark是什么,如何用Spark进行数据分析
给大家分享一下Spark是什么?如何用Spark进行数据分析,对大数据感兴趣的小伙伴就随着小编一起来了解一下吧. 大数据在线学习 什么是Apache Spark? Apache Spark是一 ...