Showing
3 changed files
with
138 additions
and
104 deletions
| @@ -26,14 +26,14 @@ class WebSocketSession: | @@ -26,14 +26,14 @@ class WebSocketSession: | ||
| 26 | self.metadata = {} | 26 | self.metadata = {} |
| 27 | 27 | ||
| 28 | def __eq__(self, other): | 28 | def __eq__(self, other): |
| 29 | - """基于websocket对象判断会话是否相等""" | 29 | + """基于session_id判断会话是否相等""" |
| 30 | if not isinstance(other, WebSocketSession): | 30 | if not isinstance(other, WebSocketSession): |
| 31 | return False | 31 | return False |
| 32 | - return self.websocket is other.websocket | 32 | + return self.session_id == other.session_id |
| 33 | 33 | ||
| 34 | def __hash__(self): | 34 | def __hash__(self): |
| 35 | - """基于websocket对象的id生成哈希值""" | ||
| 36 | - return hash(id(self.websocket)) | 35 | + """基于session_id生成哈希值""" |
| 36 | + return hash(self.session_id) | ||
| 37 | 37 | ||
| 38 | def is_alive(self) -> bool: | 38 | def is_alive(self) -> bool: |
| 39 | """检查连接是否存活""" | 39 | """检查连接是否存活""" |
| @@ -86,7 +86,7 @@ class UnifiedWebSocketManager: | @@ -86,7 +86,7 @@ class UnifiedWebSocketManager: | ||
| 86 | """统一WebSocket管理器""" | 86 | """统一WebSocket管理器""" |
| 87 | 87 | ||
| 88 | def __init__(self): | 88 | def __init__(self): |
| 89 | - self._sessions: Dict[str, Set[WebSocketSession]] = {} # session_id -> WebSocketSession集合 | 89 | + self._sessions: Dict[str, WebSocketSession] = {} # session_id -> WebSocketSession (单连接) |
| 90 | self._websockets: Dict[web.WebSocketResponse, WebSocketSession] = {} # websocket -> session映射 | 90 | self._websockets: Dict[web.WebSocketResponse, WebSocketSession] = {} # websocket -> session映射 |
| 91 | self._message_handlers: Dict[str, Callable] = {} # 消息类型处理器 | 91 | self._message_handlers: Dict[str, Callable] = {} # 消息类型处理器 |
| 92 | self._event_handlers: Dict[str, List[Callable]] = {} # 事件处理器 | 92 | self._event_handlers: Dict[str, List[Callable]] = {} # 事件处理器 |
| @@ -121,7 +121,7 @@ class UnifiedWebSocketManager: | @@ -121,7 +121,7 @@ class UnifiedWebSocketManager: | ||
| 121 | logger.error(f'事件处理器执行失败 {event_type}: {e}') | 121 | logger.error(f'事件处理器执行失败 {event_type}: {e}') |
| 122 | 122 | ||
| 123 | def add_session(self, session_id: str, websocket: web.WebSocketResponse) -> WebSocketSession: | 123 | def add_session(self, session_id: str, websocket: web.WebSocketResponse) -> WebSocketSession: |
| 124 | - """添加WebSocket会话""" | 124 | + """添加WebSocket会话 - 单连接模式,新连接会替换旧连接""" |
| 125 | with self._lock: | 125 | with self._lock: |
| 126 | # 检查是否已存在相同的websocket连接 | 126 | # 检查是否已存在相同的websocket连接 |
| 127 | if websocket in self._websockets: | 127 | if websocket in self._websockets: |
| @@ -131,22 +131,25 @@ class UnifiedWebSocketManager: | @@ -131,22 +131,25 @@ class UnifiedWebSocketManager: | ||
| 131 | 131 | ||
| 132 | session = WebSocketSession(session_id, websocket) | 132 | session = WebSocketSession(session_id, websocket) |
| 133 | 133 | ||
| 134 | - # 初始化会话集合 | ||
| 135 | - if session_id not in self._sessions: | ||
| 136 | - self._sessions[session_id] = set() | ||
| 137 | - | ||
| 138 | - # 检查Set添加前后的大小变化 | ||
| 139 | - before_count = len(self._sessions[session_id]) | ||
| 140 | - self._sessions[session_id].add(session) | ||
| 141 | - after_count = len(self._sessions[session_id]) | 134 | + # 如果已存在该session_id的连接,先清理旧连接 |
| 135 | + if session_id in self._sessions: | ||
| 136 | + old_session = self._sessions[session_id] | ||
| 137 | + # 从websockets映射中移除旧连接 | ||
| 138 | + if old_session.websocket in self._websockets: | ||
| 139 | + del self._websockets[old_session.websocket] | ||
| 140 | + # 尝试关闭旧连接 | ||
| 141 | + try: | ||
| 142 | + if not old_session.websocket.closed: | ||
| 143 | + asyncio.create_task(old_session.websocket.close()) | ||
| 144 | + logger.info(f"[Session:{session_id}] 已关闭旧连接") | ||
| 145 | + except Exception as e: | ||
| 146 | + logger.warning(f"[Session:{session_id}] 关闭旧连接时出错: {e}") | ||
| 142 | 147 | ||
| 148 | + # 添加新连接 (单连接模式) | ||
| 149 | + self._sessions[session_id] = session | ||
| 143 | self._websockets[websocket] = session | 150 | self._websockets[websocket] = session |
| 144 | 151 | ||
| 145 | - logger.info(f'[Session:{session_id}] 添加WebSocket会话 (WebSocket={id(websocket)}), 连接数变化: {before_count} -> {after_count}') | ||
| 146 | - | ||
| 147 | - # 如果Set大小没有变化,说明可能存在重复 | ||
| 148 | - if before_count == after_count: | ||
| 149 | - logger.warning(f'[Session:{session_id}] 检测到可能的重复会话添加!Set大小未变化') | 152 | + logger.info(f'[Session:{session_id}] 添加WebSocket会话 (单连接模式) (WebSocket={id(websocket)})') |
| 150 | 153 | ||
| 151 | return session | 154 | return session |
| 152 | 155 | ||
| @@ -157,10 +160,8 @@ class UnifiedWebSocketManager: | @@ -157,10 +160,8 @@ class UnifiedWebSocketManager: | ||
| 157 | session = self._websockets[websocket] | 160 | session = self._websockets[websocket] |
| 158 | session_id = session.session_id | 161 | session_id = session.session_id |
| 159 | 162 | ||
| 160 | - # 从会话集合中移除 | ||
| 161 | - if session_id in self._sessions: | ||
| 162 | - self._sessions[session_id].discard(session) | ||
| 163 | - if not self._sessions[session_id]: # 如果集合为空,删除键 | 163 | + # 从会话映射中移除(单连接模式) |
| 164 | + if session_id in self._sessions and self._sessions[session_id] == session: | ||
| 164 | del self._sessions[session_id] | 165 | del self._sessions[session_id] |
| 165 | 166 | ||
| 166 | # 从websocket映射中移除 | 167 | # 从websocket映射中移除 |
| @@ -174,49 +175,57 @@ class UnifiedWebSocketManager: | @@ -174,49 +175,57 @@ class UnifiedWebSocketManager: | ||
| 174 | """获取WebSocket会话""" | 175 | """获取WebSocket会话""" |
| 175 | return self._websockets.get(websocket) | 176 | return self._websockets.get(websocket) |
| 176 | 177 | ||
| 177 | - def get_sessions_by_id(self, session_id: str) -> Set[WebSocketSession]: | ||
| 178 | - """根据会话ID获取所有WebSocket会话""" | 178 | + def get_sessions_by_id(self, session_id: str) -> Optional[WebSocketSession]: |
| 179 | + """根据会话ID获取WebSocket会话(单连接模式)""" | ||
| 179 | with self._lock: | 180 | with self._lock: |
| 180 | # 尝试使用原始session_id查找 | 181 | # 尝试使用原始session_id查找 |
| 181 | - sessions = self._sessions.get(session_id, set()) | ||
| 182 | - if sessions: | ||
| 183 | - return sessions.copy() | 182 | + session = self._sessions.get(session_id) |
| 183 | + if session: | ||
| 184 | + return session | ||
| 184 | 185 | ||
| 185 | # 如果是字符串类型但存储的是整数类型,尝试转换 | 186 | # 如果是字符串类型但存储的是整数类型,尝试转换 |
| 186 | if isinstance(session_id, str) and session_id.isdigit(): | 187 | if isinstance(session_id, str) and session_id.isdigit(): |
| 187 | int_session_id = int(session_id) | 188 | int_session_id = int(session_id) |
| 188 | - sessions = self._sessions.get(int_session_id, set()) | ||
| 189 | - if sessions: | ||
| 190 | - return sessions.copy() | 189 | + session = self._sessions.get(int_session_id) |
| 190 | + if session: | ||
| 191 | + return session | ||
| 191 | 192 | ||
| 192 | # 如果是整数类型但存储的是字符串类型,尝试转换 | 193 | # 如果是整数类型但存储的是字符串类型,尝试转换 |
| 193 | elif isinstance(session_id, int): | 194 | elif isinstance(session_id, int): |
| 194 | str_session_id = str(session_id) | 195 | str_session_id = str(session_id) |
| 195 | - sessions = self._sessions.get(str_session_id, set()) | ||
| 196 | - if sessions: | ||
| 197 | - return sessions.copy() | 196 | + session = self._sessions.get(str_session_id) |
| 197 | + if session: | ||
| 198 | + return session | ||
| 198 | 199 | ||
| 199 | - return set() | 200 | + return None |
| 200 | 201 | ||
| 201 | def _update_session_id(self, websocket: web.WebSocketResponse, old_session_id: str, new_session_id: str): | 202 | def _update_session_id(self, websocket: web.WebSocketResponse, old_session_id: str, new_session_id: str): |
| 202 | - """更新WebSocket会话的session_id""" | 203 | + """更新WebSocket会话的session_id(单连接模式)""" |
| 203 | with self._lock: | 204 | with self._lock: |
| 204 | if websocket in self._websockets: | 205 | if websocket in self._websockets: |
| 205 | session = self._websockets[websocket] | 206 | session = self._websockets[websocket] |
| 206 | 207 | ||
| 207 | - # 从旧的session_id集合中移除 | ||
| 208 | - if old_session_id in self._sessions: | ||
| 209 | - self._sessions[old_session_id].discard(session) | ||
| 210 | - if not self._sessions[old_session_id]: # 如果集合为空,删除键 | 208 | + # 从旧的session_id映射中移除(只有当前session匹配时) |
| 209 | + if old_session_id in self._sessions and self._sessions[old_session_id] == session: | ||
| 211 | del self._sessions[old_session_id] | 210 | del self._sessions[old_session_id] |
| 212 | 211 | ||
| 213 | # 更新session的session_id | 212 | # 更新session的session_id |
| 214 | session.session_id = new_session_id | 213 | session.session_id = new_session_id |
| 215 | 214 | ||
| 216 | - # 添加到新的session_id集合 | ||
| 217 | - if new_session_id not in self._sessions: | ||
| 218 | - self._sessions[new_session_id] = set() | ||
| 219 | - self._sessions[new_session_id].add(session) | 215 | + # 如果新session_id已存在,先清理旧连接 |
| 216 | + if new_session_id in self._sessions: | ||
| 217 | + old_session = self._sessions[new_session_id] | ||
| 218 | + if old_session.websocket in self._websockets: | ||
| 219 | + del self._websockets[old_session.websocket] | ||
| 220 | + try: | ||
| 221 | + if not old_session.websocket.closed: | ||
| 222 | + asyncio.create_task(old_session.websocket.close()) | ||
| 223 | + logger.info(f"[Session:{new_session_id}] 更新时关闭旧连接") | ||
| 224 | + except Exception as e: | ||
| 225 | + logger.warning(f"[Session:{new_session_id}] 更新时关闭旧连接出错: {e}") | ||
| 226 | + | ||
| 227 | + # 添加到新的session_id映射(单连接模式) | ||
| 228 | + self._sessions[new_session_id] = session | ||
| 220 | 229 | ||
| 221 | logger.info(f'[Session] 更新会话ID: {old_session_id} -> {new_session_id}') | 230 | logger.info(f'[Session] 更新会话ID: {old_session_id} -> {new_session_id}') |
| 222 | return True | 231 | return True |
| @@ -225,39 +234,32 @@ class UnifiedWebSocketManager: | @@ -225,39 +234,32 @@ class UnifiedWebSocketManager: | ||
| 225 | async def broadcast_raw_message_to_session(self, session_id: str, message: Dict,source: str = "原数据") -> int: | 234 | async def broadcast_raw_message_to_session(self, session_id: str, message: Dict,source: str = "原数据") -> int: |
| 226 | """直接广播原始消息到指定会话的所有WebSocket连接""" | 235 | """直接广播原始消息到指定会话的所有WebSocket连接""" |
| 227 | # 确保session_id为字符串类型,保持一致性 | 236 | # 确保session_id为字符串类型,保持一致性 |
| 228 | - # 确保session_id为字符串类型,保持一致性 | ||
| 229 | if isinstance(session_id, int): | 237 | if isinstance(session_id, int): |
| 230 | session_id = str(session_id) | 238 | session_id = str(session_id) |
| 231 | elif not isinstance(session_id, str): | 239 | elif not isinstance(session_id, str): |
| 232 | session_id = str(session_id) | 240 | session_id = str(session_id) |
| 233 | 241 | ||
| 234 | - sessions = self.get_sessions_by_id(session_id) | ||
| 235 | - if not sessions: | 242 | + session = self.get_sessions_by_id(session_id) |
| 243 | + if not session: | ||
| 236 | logger.warning(f'[Session:{session_id}] 没有找到WebSocket连接') | 244 | logger.warning(f'[Session:{session_id}] 没有找到WebSocket连接') |
| 237 | return 0 | 245 | return 0 |
| 238 | 246 | ||
| 239 | # 详细调试日志:显示会话详情 | 247 | # 详细调试日志:显示会话详情 |
| 240 | - logger.info(f'[Session:{session_id}] 开始广播消息,找到 {len(sessions)} 个连接') | ||
| 241 | - for i, session in enumerate(sessions): | ||
| 242 | - logger.info(f'[Session:{session_id}] 连接{i+1}: WebSocket={id(session.websocket)}, 创建时间={session.created_at}, 存活状态={session.is_alive()}') | 248 | + logger.info(f'[Session:{session_id}] 开始广播消息,找到 1 个连接') |
| 249 | + logger.info(f'[Session:{session_id}] 连接: WebSocket={id(session.websocket)}, 创建时间={session.created_at}, 存活状态={session.is_alive()}') | ||
| 243 | 250 | ||
| 244 | success_count = 0 | 251 | success_count = 0 |
| 245 | - failed_sessions = [] | ||
| 246 | 252 | ||
| 247 | - for i, session in enumerate(sessions): | ||
| 248 | - logger.info(f'[Session:{session_id}] 正在向连接{i+1}发送消息 (WebSocket={id(session.websocket)})') | 253 | + logger.info(f'[Session:{session_id}] 正在发送消息 (WebSocket={id(session.websocket)})') |
| 249 | if await session.send_message(message): | 254 | if await session.send_message(message): |
| 250 | - success_count += 1 | ||
| 251 | - logger.info(f'[Session:{session_id}] 连接{i+1}发送成功') | 255 | + success_count = 1 |
| 256 | + logger.info(f'[Session:{session_id}] 发送成功') | ||
| 252 | else: | 257 | else: |
| 253 | - failed_sessions.append(session) | ||
| 254 | - logger.warning(f'[Session:{session_id}] 连接{i+1}发送失败') | ||
| 255 | - | 258 | + logger.warning(f'[Session:{session_id}] 发送失败') |
| 256 | # 清理失败的连接 | 259 | # 清理失败的连接 |
| 257 | - for session in failed_sessions: | ||
| 258 | self.remove_session(session.websocket) | 260 | self.remove_session(session.websocket) |
| 259 | 261 | ||
| 260 | - logger.info(f'[Session:{session_id}] 广播原始消息完成: 成功{success_count}/总计{len(sessions)}, 失败{len(failed_sessions)}') | 262 | + logger.info(f'[Session:{session_id}] 广播原始消息完成: 成功{success_count}/总计1') |
| 261 | return success_count | 263 | return success_count |
| 262 | 264 | ||
| 263 | async def broadcast_to_session(self, session_id: str, message_type: str, content: Any, | 265 | async def broadcast_to_session(self, session_id: str, message_type: str, content: Any, |
| @@ -269,11 +271,16 @@ class UnifiedWebSocketManager: | @@ -269,11 +271,16 @@ class UnifiedWebSocketManager: | ||
| 269 | elif not isinstance(session_id, str): | 271 | elif not isinstance(session_id, str): |
| 270 | session_id = str(session_id) | 272 | session_id = str(session_id) |
| 271 | 273 | ||
| 272 | - sessions = self.get_sessions_by_id(session_id) | ||
| 273 | - if not sessions: | 274 | + session = self.get_sessions_by_id(session_id) |
| 275 | + if not session: | ||
| 274 | logger.warning(f'[Session:{session_id}] 没有找到WebSocket连接') | 276 | logger.warning(f'[Session:{session_id}] 没有找到WebSocket连接') |
| 275 | return 0 | 277 | return 0 |
| 276 | 278 | ||
| 279 | + # 详细调试日志:显示会话详情 | ||
| 280 | + logger.info(f'[Session:{session_id}] 开始广播消息,找到 1 个连接') | ||
| 281 | + logger.info(f'[Session:{session_id}] 连接: WebSocket={id(session.websocket)}, 创建时间={session.created_at}, 存活状态={session.is_alive()}') | ||
| 282 | + | ||
| 283 | + | ||
| 277 | message = { | 284 | message = { |
| 278 | "type": message_type, | 285 | "type": message_type, |
| 279 | "session_id": session_id, | 286 | "session_id": session_id, |
| @@ -284,19 +291,17 @@ class UnifiedWebSocketManager: | @@ -284,19 +291,17 @@ class UnifiedWebSocketManager: | ||
| 284 | } | 291 | } |
| 285 | 292 | ||
| 286 | success_count = 0 | 293 | success_count = 0 |
| 287 | - failed_sessions = [] | ||
| 288 | 294 | ||
| 289 | - for session in sessions: | 295 | + logger.info(f'[Session:{session_id}] 正在发送消息 (WebSocket={id(session.websocket)})') |
| 290 | if await session.send_message(message): | 296 | if await session.send_message(message): |
| 291 | - success_count += 1 | 297 | + success_count = 1 |
| 298 | + logger.info(f'[Session:{session_id}] 发送成功') | ||
| 292 | else: | 299 | else: |
| 293 | - failed_sessions.append(session) | ||
| 294 | - | 300 | + logger.warning(f'[Session:{session_id}] 发送失败') |
| 295 | # 清理失败的连接 | 301 | # 清理失败的连接 |
| 296 | - for session in failed_sessions: | ||
| 297 | self.remove_session(session.websocket) | 302 | self.remove_session(session.websocket) |
| 298 | 303 | ||
| 299 | - logger.info(f'[Session:{session_id}] 广播消息成功: {success_count}/{len(sessions)}') | 304 | + logger.info(f'[Session:{session_id}] 广播原始消息完成: 成功{success_count}/总计1') |
| 300 | return success_count | 305 | return success_count |
| 301 | 306 | ||
| 302 | async def broadcast_to_all(self, message_type: str, content: Any, | 307 | async def broadcast_to_all(self, message_type: str, content: Any, |
| @@ -324,7 +329,7 @@ class UnifiedWebSocketManager: | @@ -324,7 +329,7 @@ class UnifiedWebSocketManager: | ||
| 324 | return len(self._websockets) | 329 | return len(self._websockets) |
| 325 | 330 | ||
| 326 | def get_session_stats(self) -> Dict[str, Any]: | 331 | def get_session_stats(self) -> Dict[str, Any]: |
| 327 | - """获取会话统计信息""" | 332 | + """获取会话统计信息(单连接模式)""" |
| 328 | with self._lock: | 333 | with self._lock: |
| 329 | stats = { | 334 | stats = { |
| 330 | "total_sessions": len(self._sessions), | 335 | "total_sessions": len(self._sessions), |
| @@ -332,17 +337,15 @@ class UnifiedWebSocketManager: | @@ -332,17 +337,15 @@ class UnifiedWebSocketManager: | ||
| 332 | "session_details": {} | 337 | "session_details": {} |
| 333 | } | 338 | } |
| 334 | 339 | ||
| 335 | - for session_id, sessions in self._sessions.items(): | 340 | + for session_id, session in self._sessions.items(): |
| 336 | stats["session_details"][session_id] = { | 341 | stats["session_details"][session_id] = { |
| 337 | - "connection_count": len(sessions), | ||
| 338 | - "connections": [ | ||
| 339 | - { | 342 | + "connection_count": 1, # 单连接模式固定为1 |
| 343 | + "connection": { | ||
| 340 | "created_at": session.created_at, | 344 | "created_at": session.created_at, |
| 341 | "last_ping": session.last_ping, | 345 | "last_ping": session.last_ping, |
| 342 | "is_alive": session.is_alive(), | 346 | "is_alive": session.is_alive(), |
| 343 | "metadata": session.metadata | 347 | "metadata": session.metadata |
| 344 | - } for session in sessions | ||
| 345 | - ] | 348 | + } |
| 346 | } | 349 | } |
| 347 | 350 | ||
| 348 | return stats | 351 | return stats |
| @@ -69,6 +69,8 @@ class WebSocketRouter: | @@ -69,6 +69,8 @@ class WebSocketRouter: | ||
| 69 | digital_human_service = get_digital_human_service() | 69 | digital_human_service = get_digital_human_service() |
| 70 | self.service_registry.register_service(digital_human_service) | 70 | self.service_registry.register_service(digital_human_service) |
| 71 | 71 | ||
| 72 | + | ||
| 73 | + | ||
| 72 | # 注册WSA服务 | 74 | # 注册WSA服务 |
| 73 | from .wsa_websocket_service import WSAWebSocketService, initialize_wsa_service | 75 | from .wsa_websocket_service import WSAWebSocketService, initialize_wsa_service |
| 74 | wsa_service = WSAWebSocketService(self.manager) | 76 | wsa_service = WSAWebSocketService(self.manager) |
| @@ -1541,7 +1541,21 @@ | @@ -1541,7 +1541,21 @@ | ||
| 1541 | // 获取选择的消息类型,默认为chat | 1541 | // 获取选择的消息类型,默认为chat |
| 1542 | var messageType = document.getElementById('message-type') ? document.getElementById('message-type').value : 'chat'; | 1542 | var messageType = document.getElementById('message-type') ? document.getElementById('message-type').value : 'chat'; |
| 1543 | 1543 | ||
| 1544 | - // 发送消息到服务器,不再直接添加到界面,等待WebSocket推送 | 1544 | + // // 立即将用户消息显示在对话框右侧 |
| 1545 | + // var senderLabel = '用户'; | ||
| 1546 | + // var messageMode = 'text'; | ||
| 1547 | + // if (messageType === 'chat') { | ||
| 1548 | + // senderLabel = '用户'; | ||
| 1549 | + // messageMode = 'chat'; | ||
| 1550 | + // } else if (messageType === 'echo') { | ||
| 1551 | + // senderLabel = '用户'; | ||
| 1552 | + // messageMode = 'echo'; | ||
| 1553 | + // } | ||
| 1554 | + | ||
| 1555 | + // // 添加用户消息到界面 | ||
| 1556 | + // addMessage(message, 'right', senderLabel, messageMode, '', 'web'); | ||
| 1557 | + | ||
| 1558 | + // 发送消息到服务器 | ||
| 1545 | var requestData = { | 1559 | var requestData = { |
| 1546 | text: message, | 1560 | text: message, |
| 1547 | type: messageType, | 1561 | type: messageType, |
| @@ -1591,6 +1605,7 @@ | @@ -1591,6 +1605,7 @@ | ||
| 1591 | $('#clear-storage').click(function() { | 1605 | $('#clear-storage').click(function() { |
| 1592 | if (confirm('确定要清理所有本地聊天记录吗?此操作不可恢复!')) { | 1606 | if (confirm('确定要清理所有本地聊天记录吗?此操作不可恢复!')) { |
| 1593 | ChatStorage.clearStorage(); | 1607 | ChatStorage.clearStorage(); |
| 1608 | + localStorage.removeItem('chatHistory'); | ||
| 1594 | const chatMessages = document.getElementById("chatMessages"); | 1609 | const chatMessages = document.getElementById("chatMessages"); |
| 1595 | if (chatMessages) { | 1610 | if (chatMessages) { |
| 1596 | chatMessages.innerHTML = ''; | 1611 | chatMessages.innerHTML = ''; |
| @@ -2030,17 +2045,6 @@ | @@ -2030,17 +2045,6 @@ | ||
| 2030 | saveChatHistory(); | 2045 | saveChatHistory(); |
| 2031 | } | 2046 | } |
| 2032 | 2047 | ||
| 2033 | - // 清空聊天记录函数 | ||
| 2034 | - function clearChatHistory() { | ||
| 2035 | - const chatMessages = document.getElementById("chatMessages"); | ||
| 2036 | - if (chatMessages) { | ||
| 2037 | - chatMessages.innerHTML = ""; | ||
| 2038 | - } | ||
| 2039 | - // 清理新的ChatStorage数据 | ||
| 2040 | - ChatStorage.clearStorage(); | ||
| 2041 | - // 兼容清理旧的localStorage项 | ||
| 2042 | - localStorage.removeItem('chatHistory'); | ||
| 2043 | - } | ||
| 2044 | 2048 | ||
| 2045 | // 切换对话框显示/隐藏 | 2049 | // 切换对话框显示/隐藏 |
| 2046 | function toggleChatOverlay() { | 2050 | function toggleChatOverlay() { |
| @@ -2380,6 +2384,7 @@ | @@ -2380,6 +2384,7 @@ | ||
| 2380 | if (messageData.type === 'login_success') { | 2384 | if (messageData.type === 'login_success') { |
| 2381 | console.log('WebSocket登录成功:', messageData.message); | 2385 | console.log('WebSocket登录成功:', messageData.message); |
| 2382 | console.log('登录成功的sessionid:', messageData.sessionid); | 2386 | console.log('登录成功的sessionid:', messageData.sessionid); |
| 2387 | + | ||
| 2383 | updateConnectionStatus('connected', `聊天服务器已连接 (会话ID: ${messageData.sessionid || document.getElementById('sessionid').value})`); | 2388 | updateConnectionStatus('connected', `聊天服务器已连接 (会话ID: ${messageData.sessionid || document.getElementById('sessionid').value})`); |
| 2384 | return; | 2389 | return; |
| 2385 | } | 2390 | } |
| @@ -2387,6 +2392,11 @@ | @@ -2387,6 +2392,11 @@ | ||
| 2387 | // 处理心跳响应 | 2392 | // 处理心跳响应 |
| 2388 | if (messageData.type === 'pong') { | 2393 | if (messageData.type === 'pong') { |
| 2389 | console.log('收到心跳响应'); | 2394 | console.log('收到心跳响应'); |
| 2395 | + // 心跳正常时确保连接状态显示为已连接 | ||
| 2396 | + var currentSessionId = document.getElementById('sessionid').value; | ||
| 2397 | + if (currentSessionId && parseInt(currentSessionId) !== 0) { | ||
| 2398 | + updateConnectionStatus('connected', `聊天服务器已连接 (会话ID: ${currentSessionId})`); | ||
| 2399 | + } | ||
| 2390 | return; | 2400 | return; |
| 2391 | } | 2401 | } |
| 2392 | 2402 | ||
| @@ -2394,14 +2404,32 @@ | @@ -2394,14 +2404,32 @@ | ||
| 2394 | if (messageData.type === 'chat_message') { | 2404 | if (messageData.type === 'chat_message') { |
| 2395 | console.log('收到聊天消息:', messageData); | 2405 | console.log('收到聊天消息:', messageData); |
| 2396 | 2406 | ||
| 2397 | - var messageContent = messageData.content || messageData.message || messageData.text || ''; | ||
| 2398 | - var messageType = messageData.message_type || 'text'; | ||
| 2399 | - var sender = messageData.sender || 'unknown'; | 2407 | + // 正确解析嵌套的content对象 |
| 2408 | + var contentObj = messageData.content || {}; | ||
| 2409 | + var messageContent = ''; | ||
| 2410 | + var messageType = 'text'; | ||
| 2411 | + var sender = 'unknown'; | ||
| 2400 | var sessionId = messageData.session_id; | 2412 | var sessionId = messageData.session_id; |
| 2401 | - var modelInfo = messageData.model_info || ''; | ||
| 2402 | - var requestSource = messageData.request_source || ''; | 2413 | + var modelInfo = ''; |
| 2414 | + var requestSource = ''; | ||
| 2403 | var timestamp = messageData.timestamp || new Date().toISOString(); | 2415 | var timestamp = messageData.timestamp || new Date().toISOString(); |
| 2404 | 2416 | ||
| 2417 | + // 如果content是对象,从中提取字段 | ||
| 2418 | + if (typeof contentObj === 'object' && contentObj !== null) { | ||
| 2419 | + messageContent = contentObj.content || contentObj.message || contentObj.text || ''; | ||
| 2420 | + messageType = contentObj.message_type || 'text'; | ||
| 2421 | + sender = contentObj.source || messageData.sender || 'unknown'; | ||
| 2422 | + modelInfo = contentObj.model_info || ''; | ||
| 2423 | + requestSource = contentObj.request_source || ''; | ||
| 2424 | + } else { | ||
| 2425 | + // 如果content是字符串,直接使用 | ||
| 2426 | + messageContent = contentObj || messageData.message || messageData.text || ''; | ||
| 2427 | + messageType = messageData.message_type || 'text'; | ||
| 2428 | + sender = messageData.sender || 'unknown'; | ||
| 2429 | + modelInfo = messageData.model_info || ''; | ||
| 2430 | + requestSource = messageData.request_source || ''; | ||
| 2431 | + } | ||
| 2432 | + | ||
| 2405 | // 判断消息方向和样式 | 2433 | // 判断消息方向和样式 |
| 2406 | var alignment = 'left'; | 2434 | var alignment = 'left'; |
| 2407 | var senderLabel = '数字人回复'; | 2435 | var senderLabel = '数字人回复'; |
| @@ -2516,17 +2544,18 @@ | @@ -2516,17 +2544,18 @@ | ||
| 2516 | 2544 | ||
| 2517 | // 在连接关闭前发送WSA注销消息到主服务 | 2545 | // 在连接关闭前发送WSA注销消息到主服务 |
| 2518 | if (ws.readyState === WebSocket.OPEN) { | 2546 | if (ws.readyState === WebSocket.OPEN) { |
| 2519 | - try { | ||
| 2520 | - var wsaUnregisterMessage = { | ||
| 2521 | - type: 'wsa_unregister_web', | ||
| 2522 | - username: getTemporaryUsername(), | ||
| 2523 | - timestamp: Date.now() | ||
| 2524 | - }; | ||
| 2525 | - console.log('发送WSA注销消息到主服务:', wsaUnregisterMessage); | ||
| 2526 | - ws.send(JSON.stringify(wsaUnregisterMessage)); | ||
| 2527 | - } catch (error) { | ||
| 2528 | - console.error('发送WSA注销消息失败:', error); | ||
| 2529 | - } | 2547 | + // try { |
| 2548 | + // var wsaUnregisterMessage = { | ||
| 2549 | + // type: 'wsa_unregister_web', | ||
| 2550 | + // username: getTemporaryUsername(), | ||
| 2551 | + // timestamp: Date.now() | ||
| 2552 | + // }; | ||
| 2553 | + // console.log('发送WSA注销消息到主服务:', wsaUnregisterMessage); | ||
| 2554 | + // ws.send(JSON.stringify(wsaUnregisterMessage)); | ||
| 2555 | + // } catch (error) { | ||
| 2556 | + // console.error('发送WSA注销消息失败:', error); | ||
| 2557 | + // } | ||
| 2558 | + console.debug('close触发:',Date.now()); | ||
| 2530 | } | 2559 | } |
| 2531 | 2560 | ||
| 2532 | updateConnectionStatus('disconnected', 'WebSocket连接已断开,正在重连...'); | 2561 | updateConnectionStatus('disconnected', 'WebSocket连接已断开,正在重连...'); |
-
Please register or login to post a comment