接到一个应用测试,应用实现主要使用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. Shell笔记-04

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. 举个例子: #!/bin/bash a=10 echo -e "Value ...

  2. #ifdef 和 #if defined的区别

    #ifdef 和 #if defined的区别在于,后者可以组成复杂的预编译条件,比如 #if defined (AAA) && defined (BBB)xxxxxxxxx#endi ...

  3. ArrayList两个对象之间的赋值

    List<String> list1 = new ArrayList<String>(); List<String> list2 = new ArrayList&l ...

  4. C/S模式,发布/订阅模式和PUSH/PULL模式(上)

    CS模式(客户端/服务器模式) 最场景的信息传递模式,也称为Request/Response模式,或者调用模式.http/https协议即此模式.因为最常用所以大家一般都比较熟悉,这里不重点讲了,大家 ...

  5. 容易忽略的expect脚本问题,暗藏的僵尸进程,wait命令不要漏掉

    问题描述 前几天有个小需求,用到expect脚本去循环的发送一些数据,主要问题代码如下: #! /usr/bin/expect while {true} { set timeout 60 spawn ...

  6. Activiti6.0 spring5 工作流引擎 java SSM流程审批 项目框架

    1.模型管理 :web在线流程设计器.预览流程xml.导出xml.部署流程 2.流程管理 :导入导出流程资源文件.查看流程图.根据流程实例反射出流程模型.激活挂起 3.运行中流程:查看流程信息.当前任 ...

  7. sqlplus连接半天才连上

    问题现象: 某oracle数据库服务器发现使用ssh,crt连接半天1-2分钟后才返回输入密码的提示,应用人员发现使用 sys_GUID()函数获取唯一值的时候,第一次调用需要等待很长时间,但是同一s ...

  8. MySQL8.0.12版本的数据库驱动

    jdbcDriver=com.mysql.cj.jdbc.DriverjdbcUrl=jdbc:mysql://127.0.0.1:3306/jtsys?useUnicode=true&cha ...

  9. nodejs的事件轮询机制

    1.timers定时器阶段 执行定时器到点的回调函数(所有定时器setTimeout / setInterval的回调函数都在这个阶段执行) 2.idle prepare 准备阶段 TCP错误回调 3 ...

  10. HP-Socket国产优秀socket通信组件推荐

    来源:http://blog.csdn.net/clb929/article/details/51085983 * HP-Socket 官方网站:http://www.jessma.org * HP- ...