You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

43 lines
1.8 KiB

import json
from . import api
from quart import Quart, websocket, jsonify
from mycode.WebSocketManager import g_WSM
# WebSocket 路由,端口默认与 HTTP 同端口,例如 5000(开发时)
@api.websocket("/ws")
async def ws():
"""
WebSocket 连接入口
1. 客户端连接成功后首先应发送登录数据包例如 {"user_id": 1}
2. 后端解析登录数据包 user_id websocket 绑定注册
3. 后续进入消息接收循环根据数据协议TFTF++体格式处理数据
"""
# 接收登录数据包(假设为纯 JSON 包,非二进制格式)
login_msg = await websocket.receive()
try:
login_data = json.loads(login_msg)
user_id = login_data.get("user_id")
if user_id is None:
error_msg = g_WSM.create_binary_error_message("没有提供user_id")
await websocket.send(error_msg)
return
# 注册当前连接
await g_WSM.register(user_id, websocket)
except Exception as e:
errof_msg = g_WSM.create_binary_error_message(str(e))
await websocket.send(errof_msg)
return
try:
# 主循环:接收后续消息并处理;此处可以根据协议解析消息 ---暂时无web发送数据的业务
while True:
message = await websocket.receive()
# 这里可以添加对接收到的消息解析处理,根据协议分离 TFTF 等
print("收到消息:", message)
# 例如,直接回显消息;实际项目中应解析消息格式并调用相应的业务逻辑
# await websocket.send(message)
except Exception as e:
print("WebSocket 出现异常:", e)
finally:
# 注销当前连接
await g_WSM.unregister(user_id)