50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
import asyncio
|
||
import websockets
|
||
import json
|
||
|
||
connected_clients = set()
|
||
|
||
# ✅ 适配 websockets >=11.x,只接受 websocket 参数
|
||
async def ws_handler(websocket):
|
||
connected_clients.add(websocket)
|
||
print("客户端已连接")
|
||
try:
|
||
async for message in websocket:
|
||
print("收到前端消息:", message)
|
||
except websockets.exceptions.ConnectionClosed:
|
||
print("客户端断开连接")
|
||
finally:
|
||
connected_clients.remove(websocket)
|
||
|
||
# 推送消息到所有前端
|
||
async def push_to_all_clients(user_data: dict):
|
||
# ✅ 直接发送结构化 JSON
|
||
message = {
|
||
"type": "join",
|
||
"data": user_data
|
||
}
|
||
for client in connected_clients.copy():
|
||
try:
|
||
await client.send(json.dumps(message)) # ✅ 注意是 JSON 序列化
|
||
except:
|
||
pass
|
||
# 启动 WebSocket 服务
|
||
async def ws_main():
|
||
print("✅ WebSocket 服务已启动:ws://127.0.0.1:8888")
|
||
async with websockets.serve(ws_handler, "0.0.0.0", 8888):
|
||
await asyncio.Future() # 永远挂起,保持服务运行
|
||
|
||
# 主线程中调用这个方法推送消息
|
||
def push_to_frontend(user_data):
|
||
loop = asyncio.get_event_loop()
|
||
if loop.is_running():
|
||
asyncio.run_coroutine_threadsafe(push_to_all_clients(user_data), loop)
|
||
else:
|
||
loop.run_until_complete(push_to_all_clients(user_data))
|
||
|
||
# 在线程中启动服务
|
||
def start_ws_server():
|
||
loop = asyncio.new_event_loop()
|
||
asyncio.set_event_loop(loop)
|
||
loop.run_until_complete(ws_main())
|