|
|
@ -193,12 +193,16 @@ class WebSocketClient: |
|
|
|
|
|
|
|
|
单一职责:只负责接收数据并调用处理器,不处理业务逻辑 |
|
|
单一职责:只负责接收数据并调用处理器,不处理业务逻辑 |
|
|
""" |
|
|
""" |
|
|
|
|
|
logger.info(f"WebSocket客户端 {self.name} 开始接收消息循环") |
|
|
try: |
|
|
try: |
|
|
while self.is_connected: |
|
|
while self.is_connected: |
|
|
try: |
|
|
try: |
|
|
|
|
|
logger.debug(f"WebSocket客户端 {self.name} 等待接收消息...") |
|
|
message = await self._websocket.recv() |
|
|
message = await self._websocket.recv() |
|
|
self._last_message_at = datetime.now() |
|
|
self._last_message_at = datetime.now() |
|
|
|
|
|
|
|
|
|
|
|
logger.info(f"WebSocket客户端 {self.name} 收到原始消息: {message}") |
|
|
|
|
|
|
|
|
# 调用消息处理器 |
|
|
# 调用消息处理器 |
|
|
await self._handle_message(message) |
|
|
await self._handle_message(message) |
|
|
|
|
|
|
|
|
@ -213,6 +217,8 @@ class WebSocketClient: |
|
|
logger.info(f"WebSocket客户端 {self.name} 接收任务已取消") |
|
|
logger.info(f"WebSocket客户端 {self.name} 接收任务已取消") |
|
|
except Exception as e: |
|
|
except Exception as e: |
|
|
logger.error(f"WebSocket客户端 {self.name} 接收任务异常: {e}") |
|
|
logger.error(f"WebSocket客户端 {self.name} 接收任务异常: {e}") |
|
|
|
|
|
finally: |
|
|
|
|
|
logger.info(f"WebSocket客户端 {self.name} 接收消息循环结束") |
|
|
|
|
|
|
|
|
async def _handle_message(self, message: Any): |
|
|
async def _handle_message(self, message: Any): |
|
|
"""处理接收到的消息 |
|
|
"""处理接收到的消息 |
|
|
@ -220,33 +226,42 @@ class WebSocketClient: |
|
|
单一职责:只负责调用注册的处理器,不处理业务逻辑 |
|
|
单一职责:只负责调用注册的处理器,不处理业务逻辑 |
|
|
""" |
|
|
""" |
|
|
try: |
|
|
try: |
|
|
|
|
|
logger.debug(f"WebSocket客户端 {self.name} 开始处理消息: {message}") |
|
|
|
|
|
|
|
|
# 尝试解析JSON消息 |
|
|
# 尝试解析JSON消息 |
|
|
if isinstance(message, str): |
|
|
if isinstance(message, str): |
|
|
try: |
|
|
try: |
|
|
parsed_message = json.loads(message) |
|
|
parsed_message = json.loads(message) |
|
|
message_type = parsed_message.get("type", "data") |
|
|
message_type = parsed_message.get("type", "data") |
|
|
|
|
|
logger.debug(f"WebSocket客户端 {self.name} 解析JSON消息成功: type={message_type}") |
|
|
except json.JSONDecodeError: |
|
|
except json.JSONDecodeError: |
|
|
message_type = "raw" |
|
|
message_type = "raw" |
|
|
parsed_message = {"type": "raw", "data": message} |
|
|
parsed_message = {"type": "raw", "data": message} |
|
|
|
|
|
logger.debug(f"WebSocket客户端 {self.name} JSON解析失败,作为raw消息处理") |
|
|
else: |
|
|
else: |
|
|
message_type = "raw" |
|
|
message_type = "raw" |
|
|
parsed_message = {"type": "raw", "data": message} |
|
|
parsed_message = {"type": "raw", "data": message} |
|
|
|
|
|
logger.debug(f"WebSocket客户端 {self.name} 非字符串消息,作为raw消息处理") |
|
|
|
|
|
|
|
|
# 调用对应的处理器 |
|
|
# 调用对应的处理器 |
|
|
handler = self._message_handlers.get(message_type) |
|
|
handler = self._message_handlers.get(message_type) |
|
|
if handler: |
|
|
if handler: |
|
|
|
|
|
logger.debug(f"WebSocket客户端 {self.name} 调用消息处理器: {message_type}") |
|
|
if asyncio.iscoroutinefunction(handler): |
|
|
if asyncio.iscoroutinefunction(handler): |
|
|
await handler(parsed_message) |
|
|
await handler(parsed_message) |
|
|
else: |
|
|
else: |
|
|
handler(parsed_message) |
|
|
handler(parsed_message) |
|
|
|
|
|
logger.debug(f"WebSocket客户端 {self.name} 消息处理器调用完成: {message_type}") |
|
|
else: |
|
|
else: |
|
|
# 调用通配符处理器 |
|
|
# 调用通配符处理器 |
|
|
wildcard_handler = self._message_handlers.get("*") |
|
|
wildcard_handler = self._message_handlers.get("*") |
|
|
if wildcard_handler: |
|
|
if wildcard_handler: |
|
|
|
|
|
logger.debug(f"WebSocket客户端 {self.name} 调用通配符处理器") |
|
|
if asyncio.iscoroutinefunction(wildcard_handler): |
|
|
if asyncio.iscoroutinefunction(wildcard_handler): |
|
|
await wildcard_handler(parsed_message) |
|
|
await wildcard_handler(parsed_message) |
|
|
else: |
|
|
else: |
|
|
wildcard_handler(parsed_message) |
|
|
wildcard_handler(parsed_message) |
|
|
|
|
|
logger.debug(f"WebSocket客户端 {self.name} 通配符处理器调用完成") |
|
|
else: |
|
|
else: |
|
|
logger.debug(f"WebSocket客户端 {self.name} 收到未处理的消息类型: {message_type}") |
|
|
logger.debug(f"WebSocket客户端 {self.name} 收到未处理的消息类型: {message_type}") |
|
|
|
|
|
|
|
|
|