sanic之websocket路由
在某些时候,需要建立websocket路由,来建立长链接,来实时传输数据,就比如一些聊天应用,就有实时音视频,需要实时传出状态
在sanic框架中支持两种websocket路由方式,有一种是再app中建立,另一种实在蓝图中,但是没有提供类的路由写法,都是通过函数的写法
1.app
from sanic import Sanic
app = Sanic(__name__) @app.websocket('/feed')
async def feed(request, ws):
try:
while True:
data = 'hello!'
print('Sending: ' + data)
await ws.send(data)
data = await ws.recv()
print('Received: ' + data)
except Exception as e:
print(e) #app.add_websocket_route(feed, "/feed")
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8009)
2.blueprint
接口:ws://ip号:8001/api/student/v2/feed
StudentVideoCallBP = Blueprint(__name__, url_prefix='/api/student/v2/')
@StudentVideoCallBP.websocket('/feed')
async def feed(ws):
try:
while True:
data = 'hello!'
print('Sending: ' + data)
await ws.send(data)
data = await ws.recv()
print('Received: ' + data)
except Exception as e:
print(e)
# StudentVideoCallBP.add_websocket_route(feed, "/feed")
3.略微复杂的一个小demo,写的是一个客户端和服务端实时通信,接口ws://10.130.145.200:8001/api/student/v2/wxlink/5ad85e49705deb4d3b98c111
async def wxLink(request, ws, studentMid):
student = await Student.find_one(studentMid, as_raw=True)
#循环监听是否有客户端链接,
while True:
#try客户端链接状态
try:
#try判断是数据是否有这个学生id
try:
if not student:
#告诉客户端id错误,可能是个非法链接,然后主动断开非法链接
await ws.send(osjson.dumps(
{"studentMid": "", "videoRoomId": "", 'userSig': "", 'privateMapKey': "", 'sdkAppId': ""}))
break
Rucode = student['Rucode']
key = studentMid + '_' + Rucode
videoStatus = await ws.recv()
if videoStatus == '' and str(ws.state) == 'State.OPEN':
data = await VideoData.get(key)
if data:
value = osjson.loads(data)
roomId = value['videoRoomId']
privateMapKey = value['privateMapKey']
sdkAppId = str(value['sdkAppId'])
userSig = str(value['user_userSig'])
status = value['status']
IsAvailable = value['IsAvailable']
if status == 0 and str(ws.state) == 'State.OPEN' and IsAvailable == 1:
await ws.send(osjson.dumps({"studentMid": "ok", 'videoRoomId': roomId, 'userSig': userSig,
'privateMapKey': privateMapKey, 'sdkAppId': sdkAppId}))
elif status == 0 and str(ws.state) == 'State.OPEN' and IsAvailable == 2:
await ws.send(osjson.dumps(
{"studentMid": "ok", 'videoRoomId': "", 'userSig': "",
'privateMapKey': "", 'sdkAppId': ""})) # 确认接收到roomId
elif videoStatus == '':
data = await VideoData.get(key)
if data:
value = osjson.loads(data)
value['status'] = 1
doc = osjson.dumps(value)
await VideoData.set(key, doc) # 接通成功
elif videoStatus == '':
value = await VideoData.get(key)
if value:
await VideoData.delete(key)
else:
pass
# 拒绝接通
elif videoStatus == '':
req = await VideoData.get(key)
if req:
classRoomUid = osjson.loads(req)['classRoomUid']
await VideoData.delete(key)
# 推送消息
push_title = "I40001"
message = '对方已拒绝'
try:
await pushmsg(student['Rucode'], classRoomUid, push_title, message)
except Exception as e:
print(e)
elif videoStatus == '':
req = await VideoData.get(key)
if req:
await VideoData.delete(key)
else:
pass
except TypeError:
ws.close()
#监听如果客户端断开链接,则服务端退出循环,断开链接
except ConnectionClosed:
break
4.一般websocket需要加验证,否则各种非法连接进来可咋整,加个token装饰器就可以了
5.提供两个在线测试工具
http://www.blue-zero.com/WebSocket/
http://coolaf.com/tool/chattest
注释:
ws.state 查看ws链接状态
ws.close 关闭链接
sanic之websocket路由的更多相关文章
- sanic官方文档解析之websocket(网络套接字)和handle decorators(处理程序装饰器)
1,websocket(网络套接字) 在websocket上Sanic提供了一种简单使用的抽象化,来设置websocket(网络套接字) from sanic import Sanic from sa ...
- sanic官方文档解析之路由
1,路由,路由相当于一个网址的地址,来确定网址的位置和唯一性 当http://server.url/被允许访问服务器,当最后的"/"通过路由匹配到了业务逻辑处理的函数,将会返回一个 ...
- Sanic框架
Sanic框架 1. 入门 Sanic 是一款类似Flask的Web服务器,它运行在Python 3.5+上. 除了与Flask功能类似之外,它还支持异步请求处理,这意味着你可以使用Python3.5 ...
- sanic官方文档解析之Example(二)
1,通过docker部署sanic项目 通过Docker和Docker Compose部署SANIC应用程序是一项很容易实现的任务,下面的示例提供了示例simple_server.py的部署 FROM ...
- sanic官方文档解析之蓝图
1,蓝图(Blueprints) 蓝图可用于子路由的应用,代替增加路由的存在,蓝图的定义和增加路由的方法相似,灵活的在应用中注册,并且可插拔的方式. 尤其是在大型应用中使用蓝图的时候在你逻辑打断的地方 ...
- 【土旦】Vue+WebSocket 实现长连接
1.websocket 连接代码 created() { this.initWebsocket() }, methods: { // 初始化websocket initWebsocket() { le ...
- django 实现websocket
一.简述:django实现websocket,之前django-websocket退出到3.0之后,被废弃.官方推荐大家使用channels. channels通过升级http协议 升级到websoc ...
- thinkphp 6.0 swoole扩展websocket使用教程
前言 ThinkPHP即将迎来最新版本6.0,针对目前越来越流行Swoole,thinkphp也推出了最新的扩展think-swoole 3.0. 介绍 即将推出的tp6.0,已经适配swoole.并 ...
- websocket聊天室
目录 websocket方法总结 群聊功能 基于websocket聊天室(版本一) websocket方法总结 # 后端 3个 class ChatConsumer(WebsocketConsumer ...
随机推荐
- Linux NIO 系列(04-1) select
目录 一.select 机制的优势 二.select API 介绍与使用 2.1 select 2.2 fd_set 集合操作 2.3 select 使用范例 三.深入理解 select 模型: 四. ...
- python- 属性 静态方法,类方法
一,面向对象结构与成员 1,1 面向对象结构分析: 那么每个大区域又可以分为多个小部分: class A: company_name = '老男孩教育' # 静态变量(静态字段) __iphone = ...
- Java技术专区-虚拟机系列-虚拟机参数(常用)
基础参数系类(内存分配) -server:一定要作为第一个参数,在多个CPU时性能佳 -Xmn:young generation的heap大小,一般设置为Xmx的3.4分之一-Xms:初始Heap大小 ...
- vps被封逃逸_v2+cloudflare+websocket+tls+nginx
每逢重大节日,总有那么一大部分vps凉凉,以下为能正经正常使用vps,无奈之举,此法由于多层代理,夜间速度会有影响,白天感受不明显. 由于博客园内容审查,v2_ray 中间的 下划线为分隔符,相关链接 ...
- 解决 使用migrations 执行update-database 出现System.InvalidOperationException: 实例失败的问题
好久没有使用Code First的方式来创建模型了 今天重温了一下 但是出现了很多问题 现在总结一下 在我做完初期的操作的之后,使用 update-database -verbose 更新数据库时, ...
- activiti网关
activiti中有两种网关:并行网关,排他网关. 排他网关用于任务选择等情况,流程图如下 bpnm代码如下 <?xml version="1.0" encoding=&qu ...
- ICPC2008哈尔滨-A-Array Without Local Maximums
题目描述 Ivan unexpectedly saw a present from one of his previous birthdays. It is array of n numbers fr ...
- input | button | textarea 元素的checked, disabled,hidden属性控制
这三种元素涉及到的checked, disabled,hidden属性的控制方法如下 一.attribute方法: //以下3行,都会影响HTML的( checked | disabled | hid ...
- Centos7搭建SkyWalking分布式追踪,以mysql为存储
Skywalking专门为微服务架构和云原生架构系统而设计并且支持分布式链路追踪的APM系统,即应用性能监控系统,为微服务架构和云原生架构系统设计.它通过探针自动收集所需的指标,并进行分布式追踪.通过 ...
- node快速入门
nodejs是一个方兴未艾的技术,近几年一直活跃在各大论坛.其实nodejs也只是新瓶装旧酒,只是它的一些激进的特性使她显得很神秘.nodejs使用的是JavaScript的语法,所以在学习nodej ...