接到一个应用测试,应用实现主要使用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格式交换数据的更多相关文章

  1. jmeter 测试websocket接口(一)

    jmeter 测试websocket接口时,需要对jmeter添加测试websocket的jar包. 下载地址: https://download.csdn.net/download/qq_14913 ...

  2. SpringBoot使用protobuf格式的接口

    SpringBoot使用protobuf格式的接口 建立SpringBoot项目,pom.xml内容如下: <?xml version="1.0" encoding=&quo ...

  3. 『动善时』JMeter基础 — 50、使用JMeter测试WebSocket接口

    目录 1.什么是WebSocket接口 2.为什么需要WebSocket 3.测试WebService接口前的准备 4.WebSocket Sampler组件界面详解 5.使用JMeter测试WebS ...

  4. [Openfire]使用WebSocket建立Openfire的客户端

    近日工作闲暇之余,对IM系统产生了兴趣,转而研究了IM的内容.找了半天,知道比较流行的是Openfire的系统,Openfire有许多平台实现,由于我是做Web的,所以当然是希望寻找Web的实现.Op ...

  5. 比起 JSON 更方便、更快速、更簡短的 Protobuf 格式

    Protocol Buffers 是由 Google 所推出的一格式(後台真硬),你可以把它想像成是 XML 或 JSON 格式,但是更小.更快,而且更簡潔.這能夠幫你節省網路與硬體資源,且你只需要定 ...

  6. Spring Boot WebFlux-08——WebFlux 中 WebSocket 实现通信

    第08课:WebFlux 中 WebSocket 实现通信 前言 WebFlux 该模块中包含了对反应式 HTTP.服务器推送事件和 WebSocket 的客户端和服务器端的支持.这里我们简单实践下 ...

  7. windows azure中国 里面建立一个虚拟机,与虚拟机建立通信 里面部署IIS,外网访问

    在windows azure中国 里面建立一个虚拟机,里面部署IIS,外网不能访问么? 外网访问的地址是给的那个DNS地址 ,比如我的是 DNS 名称 urbanairserver.cloudapp. ...

  8. JMeter怎样测试WebSocket

    一.安装WebSocket取样器 1.从JMeter插件管理器官网下载: https://jmeter-plugins.org/ 把这6个jar包放到C:\JMeter\apache-jmeter-3 ...

  9. c# 使用protobuf格式操作 Redis

    protobuf格式介绍 1.protobuf为goole定义的类似于json的数据格式.2.最终都需要序列化为二进制形式进行传输存储.3.相对于xml,json格式来说,序列化为二进制后占用空间更小 ...

随机推荐

  1. Windows安装openssl

    Windows下有两种方式安装openssl,第一种是采用安装包方式进行安装,第二种是采用编译源码方式进行安装.这里采用第一种方式,简单,直接. windows的openssl安装包的下载地址为:ht ...

  2. vlc源码分析(四) 调用libts接收TS流

    代码分析前,先要了解TS流基本概念:TS流之基本概念. VLC解析TS流是通过libts库来分离的,libts库使用libdvbpsi库来解TS表.VLC使用模块加载机制来加载libts库,具体调用的 ...

  3. Factory(工厂)模式

    设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题. ...

  4. MAC 相关

    1.找回个人收藏下的消失项,如文稿等   点击个人收藏中下的任意项,如桌面.下载等,按住Command+上箭头,出现如下界面,拖住消失项添加到个人收藏即可

  5. [NOI2015]软件包管理器(树链剖分,线段树)

    题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...

  6. MySQL进阶(视图)---py全栈

    目录 mysql进阶(视图)---py全栈 一.什么是视图? 二.视图的特性 三.视图的优点 四.使用场合 五.视图基本操作 六.案例 mysql进阶(视图)---py全栈 一.什么是视图? 视图是从 ...

  7. MySQL----MySQL数据库入门----第四章 单表查询

    select [distinct] * | 字段1,字段2,字段3... from 表名 [where 条件表达式] [group by 字段名] [having 条件表示式] [order by 字 ...

  8. css之层叠上下文和层叠顺序

    大家在写网页的时候会不会经常遇到莫名奇妙的样式问题,比如谁覆盖了谁.也找不出原因,为什么z-index高的却没有覆盖掉z-index低的元素呢? 带着这些疑问.我做了个小实验.代码如下: <st ...

  9. Myeclipse报错:The word is not correctly spelled

    在eclipse下的Window--Preference输入spell,然后把第一个复选框“Enable spell checking"给去掉就可以了.

  10. python3使用bencode库实现BT种子生成磁力链接

    python3 需要使用 pip install py3-bencode安装py3-bencode库. pip install py3-bencode 这里使用当前目录下的 1.torrent 文件转 ...