在某些时候,需要建立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. vue中nextTick的使用

    最近使用vue的vm.$nextTick的用法比较多,现在整理一下它的用法. 推荐阅读:http://www.ruanyifeng.com/blog/2014/10/event-loop.html   ...

  2. nmon 定时任务 监控资源

    nmon命令: # ./nmon  –f  -s 30 –c 100 说明:-f 以文件的形式输出,默认输出是机器名+日期.nmon的格式,也可以用-F指定输出的文件名,例如: # ./nmon_x8 ...

  3. SQL才是世界上最牛逼的语言!

    身处互联网行业,SQL 可能是你需要掌握的核心技能之一. 最早的时候,SQL 作为一门查询数据库的语言,是程序员的必备技能,运维.开发.Web 以及数据等从业人员都需要用到 SQL,毕竟只有查询到正确 ...

  4. [JXOI2017]数列

    题目 一个不太一样的做法 当\(A_{i-1}=x\),称\(A_1\)到\(A_{i-2}\)中大于等于\(A_{i-1}\)的最小值\(R\)为上界,\(A_1\)到\(A_{i-2}\)中小于等 ...

  5. 《构建之法》需求分析 读书笔记 Week6

    本周选读<构建之法>第8章——需求分析.由于有团队项目初期调研阶段做调查问卷的经历,这一章节中很多知识点我都比较有体会.对我而言,这一章节最有价值的内容就是厘清了关于需求分析的两个误解和近 ...

  6. Centos7系统安装笔记

    Centos 7安装步骤 对应参数,可修改 1.一台主机对应一个服务器,需要先安装Centos 7(内网)2.F12 boot 进入boot模式3.选择安装方式:USE或其他4.根据底部文字提示,点击 ...

  7. 聚合函数 -AVG/MAX/MIN/STDDEV/VARIANCE/SUM/COUNT/MEDIAN

    ------------------------------------------聚合函数--------------------------------------------- --1: AVG ...

  8. linux挂载群辉的NFS共享文件夹

    mount -t nfs 192.168.137.136:/volume1/NFSfile /NFSfile -o proto=tcp -o nolock  df -h   #查看挂载点    

  9. 获取微信企业的corpID,sercret,access_token,部门设置列表

    获取微信企业的corpID,sercret,access_token,部门设置列表   zabbix调用微信发短信可能用到的一些变量,获取方式如下: 1.corpID(公司ID) 在我的企业--企业信 ...

  10. 画PCB时检查点总结

    一.画原理图时 NPN的引脚是否对应.继电器的引脚是否对应 设计通信电路时,MCU_RX和通信芯片RS232的ROUT接.同理MCU_TX和RS232的TIN接. MCU最好留个外接晶振接口,用NPN ...