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
43 lines
1.8 KiB
3 weeks ago
|
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)
|