接到一个应用测试,应用实现主要使用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. cenos 安装hadoop

    1 创建hadoop用户 2 下载jdk和hadoop安装包 3 在root用户下解压jdk到/usr/java 4 配置JAVA_HOME 编辑/etc/profile,在文件最后添加 # set ...

  2. disconf实践(四)基于注解的分布式配置文件管理,自动reload

    上一篇讲解了基于xml的自动reload的分布式配置文件管理,这一篇讲解基于注解的自动reload的方式(基于disconf实践二). 1. 修改spring配置文件 <?xml version ...

  3. PyDev For Eclipse

    eclipse安装Pydev 1.根据自己的eclipse和你安装的python选择可以安装的版本 Update sites for various PyDev versions: Latest ve ...

  4. .NET获取IIS7.0及以上版本托管服务信息

    近期写了个扫描IIS托管站点然后定期注册到Consul的小工具,随意网上拷贝了个帮助类,搞完本机测试没问题,扔到服务器发现硕大的一个异常.. System.Runtime.InteropService ...

  5. 仿手机iPhone QQ消息小红点动画1

    前言 偶然发现iPhone QQ 显示消息条数的小红点可以响应动作事件,也有人问我这样的动画该怎么做,这里就把实现的思路简单的描述一下.在实现的过程中,同样发现该功能并没有看到的那么简单,要做一个完备 ...

  6. c#使用emit方法DB,实体相互转换

    网上有很多ORM框架和数据库转换方法. c#由EF控制,但是大家知道的是影响效率和底层控制. 因此最近几个月一直在研究.最后产出了Hikari数据库连接池. 但是该库只是定位在连接池,无法有效进行后续 ...

  7. Android Studio 2.3.3 出现Error:(26.13) Fail to resole: com.android.support.appcompat永久解决方法

    Android Studio 出现Error(26.13):Fail to resole:com.android.support.appcompat-v7.28_ Install Repository ...

  8. 基于 HTML5 Canvas 的 Web SCADA 组态电机控制面板

    前言 HT For Web 提供完整的基于 HTML5 图形界面组件库.您可以轻松构建现代化的,跨桌面和移动终端的企业应用,无需担忧跨平台兼容性,及触屏手势交互等棘手问题.也可用于快速创建和部署,高度 ...

  9. es6之扩展运算符 三个点(...)

    对象的扩展运算符理解对象的扩展运算符其实很简单,只要记住一句话就可以: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中 let bar = { a: 1, b: 2 ...

  10. 从零开始一个http服务器(五)-模拟cgi

    从零开始一个http服务器-模拟cgi(五) 代码地址 : https://github.com/flamedancer/cserver git checkout step5 运行: make cle ...