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 ...
随机推荐
- mysql中tinyint(1)与tinyint(2)的区别
tinyint 型的字段如果设置为UNSIGNED类型,只能存储从0到255的整数,不能用来储存负数.tinyint 型的字段如果不设置UNSIGNED类型,存储-128到127的整数. 1个tiny ...
- 通过一条很慢的SQL梳理下SQL优化基础
- 装完某些软件之后IE主页被https://www.hao123.com/?tn=93453552_hao_pg劫持
今天重装电脑,装完某些软件之后发现IE主页被https://www.hao123.com/?tn=93453552_hao_pg劫持,然后百度各种解决方法都没用,甚至是修改注册表依然没啥用 最后忽然看 ...
- pytest-Allure安装
mac安装allure brew install allure---安装 brew info allure---查看信息 mac端需要配置环境变量 win安装: windows/mac通用安装 • h ...
- 读书笔记-----javascript基本数据类型
由于js基础差, 记性也不好,准备一边读书一边做记录,希望这样能加深一下记忆 /* 第一天 */ javascript 基本数据类型 js一共只有五种数据类型 Undefined, Nu ...
- texindex - 对 Texinfo 索引文件排序
SYNOPSIS 总览 texindex [OPTION]... FILE... DESCRIPTION 描述 为每个 Tex 输出文件 FILE 产生一个已排序的索引.通常对于文档 `foo.tex ...
- Codeforces 1182D Complete Mirror 树的重心乱搞 / 树的直径 / 拓扑排序
题意:给你一颗树,问这颗树是否存在一个根,使得对于任意两点,如果它们到根的距离相同,那么它们的度必须相等. 思路1:树的重心乱搞 根据样例发现,树的重心可能是答案,所以我们可以先判断一下树的重心可不可 ...
- 6、Python 中 利用 openpyxl 读 写 excel 操作
__author__ = 'Administrator' from openpyxl import load_workbook # Excel_Util 类 class Excel_util: #初始 ...
- Linux part2(系统的相关设置变更)
修改Linux的系统语言 首先查看当前系统的语言 1.echo $LANG 查看当前操作系统的语言 中文:zh_CN.UTF-8 英文: en_US.UTF-8 2.临时更改默认语言,当前立即生效 重 ...
- ftp的虚拟用户的使用
虚拟用户原理 因为在linux之下,使用vsftp建立用户之后,默认使用ftp访问的时候,是会访问到对应的用户家目录.如果想多个用户同时访问某一个目录,同时对同一目录下有着不同的权限,比如部分用户只能 ...