# ACK机制支持指南 ## 概述 客户端已实现基于emit机制的ACK确认功能,允许客户端在发送消息后等待服务器确认,从而支持同步和异步两种通信模式。 ## 客户端改动 ### 1. 新增参数 客户端的三个主要发送方法 `send_text`、`send_voice` 和 `send_image` 都新增了以下参数: - `wait_for_ack: bool = False` - 是否等待服务器ACK确认 - `timeout: int = 5` - 等待ACK的超时时间(秒) ### 2. 消息格式变化 客户端发送的消息中新增了 `ack_id` 字段,格式为 `{id}_{timestamp}`,其中: - `id` 是客户端ID - `timestamp` 是当前时间的格式化字符串(精确到微秒) ### 3. ACK事件 客户端监听 `ack` 事件,用于接收服务器的确认消息。 ## 后端WebSocket服务器需要的支持 ### 1. 接收消息处理 当服务器收到客户端发送的消息时,需要: 1. 检查消息中是否包含 `ack_id` 字段 2. 如果包含 `ack_id`,立即发送ACK确认消息,不需要等待后续业务逻辑执行 3. 继续执行后续的业务逻辑 ### 2. ACK消息格式 服务器需要向客户端发送 `ack` 事件,消息格式如下: ```json { "ack_id": "客户端发送的ack_id值" } ``` ### 3. 发送ACK的时机 **非常重要**:服务器必须在收到客户端消息后**立即**发送ACK确认,而不是在业务逻辑执行完成后发送。这样可以确保客户端能够快速收到确认,继续执行后续操作。 ### 4. 实现示例(Python Socket.IO) ```python # 服务器端示例代码 @sio.on('text_message') # 根据实际事件名调整 def handle_text_message(sid, data): # 1. 立即发送ACK确认 if 'ack_id' in data: sio.emit('ack', {'ack_id': data['ack_id']}, room=sid) # 2. 执行后续业务逻辑(可能耗时较长) # ... 业务逻辑代码 ... @sio.on('voice_message') # 根据实际事件名调整 def handle_voice_message(sid, data): # 1. 立即发送ACK确认 if 'ack_id' in data: sio.emit('ack', {'ack_id': data['ack_id']}, room=sid) # 2. 执行后续业务逻辑(可能耗时较长) # ... 业务逻辑代码 ... @sio.on('image_message') # 根据实际事件名调整 def handle_image_message(sid, data): # 1. 立即发送ACK确认 if 'ack_id' in data: sio.emit('ack', {'ack_id': data['ack_id']}, room=sid) # 2. 执行后续业务逻辑(可能耗时较长) # ... 业务逻辑代码 ... ``` ## 使用示例 ### 客户端同步调用(等待ACK) ```python client = ASEngineClient(server_url, namespace, id) client.connect() # 同步调用:等待ACK确认后再继续执行 result = client.send_text('text_message', 'Hello', wait_for_ack=True, timeout=3) if result: print("消息已被服务器确认收到") # 执行后续操作 else: print("等待ACK超时") ``` ### 客户端异步调用(不等待ACK) ```python client = ASEngineClient(server_url, namespace, id) client.connect() # 异步调用:发送后立即返回,不等待ACK result = client.send_text('text_message', 'Hello', wait_for_ack=False) if result: print("消息已发送") # 执行后续操作,不需要等待ACK ``` ## 注意事项 1. **向后兼容**:客户端的改动保持了向后兼容性,现有代码无需修改即可继续使用。 2. **超时处理**:客户端会在指定的超时时间后停止等待ACK,并返回False。 3. **资源清理**:客户端会在收到ACK或超时时清理相关的ACK状态,避免内存泄漏。 4. **唯一标识**:`ack_id` 确保了每个消息的唯一性,避免ACK混淆。 5. **性能考虑**:等待ACK会阻塞当前线程,建议仅在必要时使用同步模式。 ## 总结 通过实现基于emit机制的ACK确认功能,客户端和服务器之间的通信可以灵活支持同步和异步两种模式。服务器需要做的改动非常简单,只需要在收到消息后立即发送ACK确认即可。 这种设计既保证了通信的可靠性,又不会影响业务逻辑的执行效率,是一种高效且可靠的通信方式。