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 ...
随机推荐
- 33-python基础-python3-列表插入元素-insert()方法-append()方法-extend()方法
1-insert()方法 insert()方法可以在列表任意下标处插入一个值. insert()方法的第一个参数是新值的下标,第二个参数是要插入的新值. 2-append()方法 调用 append( ...
- [轉]Linux Data Structures
Table of Contents, Show Frames, No Frames Chapter 15 Linux Data Structures This appendix lists the m ...
- 分布式-技术专区-Redis和MySQL缓存一致性问题
1.Redis 缓存和 MySQL 数据如何实现一致性 需求起因 缓存和数据库一致性解决方案 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操 ...
- pthread_create()的一个错误示例
//pthread_create()函数的错误示例 //新建线程同时传入线程号.线程号总和和消息 #include <stdio.h> #include <pthread.h> ...
- 如何取消IDEA的自动删除行尾空格?
使用IDEA,添加注释的时候敲空格,总是会把行尾空格删除导致代码跑到注释行,很不爽~~ 取消这个不爽的功能:File--Settings--Editor--General--Other--Strip ...
- ubuntu18.4 搭建lamp环境
一.Apache2 web服务器的安装: 可以先更新一下服务器(可选) 1.sudo apt update # 获取最新资源包 2.sudo apt upgrade ...
- Linux 任务管理器(二)
特殊文件与进程 fuser命令 [root@localhost home]# fuser -muv . 用户 进程号 权限 命令 /home: root kernel mount (root)/hom ...
- dubbo-源码阅读之容器启动
dubbo Main 例子 public class Start { public static void main(String[] args) throws Exception { com.ali ...
- hdu 5792 线段树+离散化+思维
题目大意: Given a sequence A with length n,count how many quadruple (a,b,c,d) satisfies: a≠b≠c≠d,1≤a< ...
- 批量修改root密码
公司有五十多台服务器.每台服务器中使用的密码完全不同,同时操作系统也不一样,centos5,6,7 .ubuntu,windows都有,更不用提其中各种小版本. root密码定期更改是一个大问题(wi ...