Flask-SocketIO服务端发送消息后未收到ack回调的问题排查
问题成因分析
- ACK确认需要客户端主动触发
SocketIO的ACK机制不属于框架自动行为,服务端发送携带callback的消息时,仅会在消息中附加唯一的ACK标识。客户端接收对应消息后,必须显式调用随消息参数传入的回调方法,才会向服务端回传ACK通知,触发服务端的回调函数。你使用的通用SocketIO测试工具默认没有实现自动调用ACK回调的逻辑,因此服务端的ack函数始终不会被触发。 - 回调函数存在参数不匹配风险
Flask-SocketIO 5.x版本在触发回调时,默认会将客户端ack调用时传入的参数传递给服务端回调函数,如果你当前的无参ack函数收到参数会触发隐式报错,也可能导致日志不打印。
解决方法
- 调整服务端ack函数写法,兼容参数传入:
def ack(*args): print('message was received!') # 如果需要获取客户端ack时携带的参数,可以直接读取args
- 客户端侧增加ack调用逻辑
如果自行编写客户端,监听message事件时主动调用回调即可,示例JS客户端代码如下:
// 客户端监听服务端send方法发送的默认message事件 socket.on('message', (msg, ackCallback) => { console.log('收到服务端消息:', msg) // 手动调用ack回调,触发服务端的回调函数 ackCallback() })
如果使用网页测试工具验证,可以在测试工具的message事件监听回调中,手动调用传入的第二个参数触发ack。
内容的提问来源于stack exchange,提问作者SimonDahrs
相关产品推荐
相关产品推荐

