在某些时候,需要建立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路由的更多相关文章

  1. sanic官方文档解析之websocket(网络套接字)和handle decorators(处理程序装饰器)

    1,websocket(网络套接字) 在websocket上Sanic提供了一种简单使用的抽象化,来设置websocket(网络套接字) from sanic import Sanic from sa ...

  2. sanic官方文档解析之路由

    1,路由,路由相当于一个网址的地址,来确定网址的位置和唯一性 当http://server.url/被允许访问服务器,当最后的"/"通过路由匹配到了业务逻辑处理的函数,将会返回一个 ...

  3. Sanic框架

    Sanic框架 1. 入门 Sanic 是一款类似Flask的Web服务器,它运行在Python 3.5+上. 除了与Flask功能类似之外,它还支持异步请求处理,这意味着你可以使用Python3.5 ...

  4. sanic官方文档解析之Example(二)

    1,通过docker部署sanic项目 通过Docker和Docker Compose部署SANIC应用程序是一项很容易实现的任务,下面的示例提供了示例simple_server.py的部署 FROM ...

  5. sanic官方文档解析之蓝图

    1,蓝图(Blueprints) 蓝图可用于子路由的应用,代替增加路由的存在,蓝图的定义和增加路由的方法相似,灵活的在应用中注册,并且可插拔的方式. 尤其是在大型应用中使用蓝图的时候在你逻辑打断的地方 ...

  6. 【土旦】Vue+WebSocket 实现长连接

    1.websocket 连接代码 created() { this.initWebsocket() }, methods: { // 初始化websocket initWebsocket() { le ...

  7. django 实现websocket

    一.简述:django实现websocket,之前django-websocket退出到3.0之后,被废弃.官方推荐大家使用channels. channels通过升级http协议 升级到websoc ...

  8. thinkphp 6.0 swoole扩展websocket使用教程

    前言 ThinkPHP即将迎来最新版本6.0,针对目前越来越流行Swoole,thinkphp也推出了最新的扩展think-swoole 3.0. 介绍 即将推出的tp6.0,已经适配swoole.并 ...

  9. websocket聊天室

    目录 websocket方法总结 群聊功能 基于websocket聊天室(版本一) websocket方法总结 # 后端 3个 class ChatConsumer(WebsocketConsumer ...

随机推荐

  1. CentOS 7 配置SFTP

    目前越来越多的FTP客户端软件开始支持SSH协议上传和下载文件,这种协议方式就是SFTP. SFTP的优势主要有两点,一是不需要再配置个FTP服务端:二是SSH协议是安全传输,上传和下载是经过加密的. ...

  2. css3属性 -webkit-filter

    css3属性 -webkit-filter -webkit-filter是css3的一个属性,Webkit率先支持了这几个功能,感觉效果很不错.下面咱们就学习一下filter这个属性吧. 现在规范中支 ...

  3. Groovy学习:第三章 Groovy开发环境

    本章将继续深入Groovy语言,首先学习Groovy脚本,包括从命令行编译和运行Groovy脚本,Groovy Shell,和Groovy Console.你将学会使用Groovy语言来建立域对象.控 ...

  4. Leetcode 算法题

    lEETCODE 算法题 0013 罗马数字转整数

  5. Android Service完全解析(上)

    转载:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Androi ...

  6. Apache Hadoop集群离线安装部署(三)——Hbase安装

    Apache Hadoop集群离线安装部署(一)——Hadoop(HDFS.YARN.MR)安装:http://www.cnblogs.com/pojishou/p/6366542.html Apac ...

  7. Mysql差集

    记录一个去差集的SQL 今天用sql去同步部分历史数据,需要用到一个求差集的sql 两张表简单结构如下: 有一个会员表 一个会员账户表 获取没有账户的会员 SELECT m.pkMember FROM ...

  8. MySQL索引与事务

    MySQL索引与事务 链接:https://pan.baidu.com/s/1ANGg3Kd_28BzQrA5ya17fQ 提取码:ekpy 复制这段内容后打开百度网盘手机App,操作更方便哦 1.索 ...

  9. BZOJ 4289 最短路+优化建图

    题意:给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边权. 解法:参考h ...

  10. codeforces 1198E Rectangle Painting 2 最小点覆盖

    题目传送门 题意: 有一个$n∗n$的网格,网格中有一些矩形是黑的,其他点都是白的. 你每次可以花费$ min (h,w)$的代价把一个$h*w$的矩形区域变白.求把所有黑格变白的最小代价. 思路: ...