测试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格式来说,序列化为二进制后占用空间更小 ...
随机推荐
- 推荐一个WPF仪表盘开源控件
前段时间,做服务器端监控系统,为了界面好看,采用WPF.硬件相关监控,比如CPU.内存等,想用仪表盘控件.网上找了很多这种控件,基本上都是第三方商业控件(虽然很漂亮,不过得money...).最后在C ...
- mail发邮件报错 "send-mail: fatal: parameter inet_interfaces: no local interface found for ::1"
发送邮件: [root@itfswelog123]# echo '测试邮件标题' | mail -s "数据库挂啦.挂啦.起床啦 " xx@163.com 出现异常: [r ...
- CodeForces - 999D Equalize the Remainders (模拟+set)
You are given an array consisting of nn integers a1,a2,…,ana1,a2,…,an , and a positive integer mm . ...
- SQL修改字段默认值、获取字段默认值
一.SQL修改字段默认值 alter table 表名 drop constraint 约束名字 说明:删除表的字段的原有约束 alter table 表名 add constraint 约束名字 D ...
- oracle基础知识过一遍(原创)
用户.角色.权限.表空间 create tablespace test1_tablespace datafile ‘test1file.dbf’ size 10m; create temporary ...
- weblogic.xml中的虚拟目录的配置
项目中的Ueditor富文本编辑器中上传图片后要能够预览. 如下图: 实现: 配置weblogic的虚拟目录:项目名称是test 如图: 这个表示:所有的访问/uefile/*的路径都会被转发到服务器 ...
- #leetcode刷题之路24-两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表.你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例:给定 1->2->3->4, 你应该返回 2-> ...
- jdk8新特性-stream
一.什么是流stream 1.可理解为高级版本的 Iterator 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的. 2.单向,不可往复 数据只能遍历一次,遍历过一次后即用尽了,就好比 ...
- css动画Demo---水波动画和边框动画
先上效果图: 水波动画: 边框动画: 1.水波动画 实现代码 <!DOCTYPE html> <html lang="en"> <head> & ...
- 树莓3B+_安装vim
第一步:访问源列表里的每个网址,并读取软件列表,然后保存在本地电脑. sudo apt-get update 第二步:安装vim sudo apt-get install vim 第三步:配置vim ...