Python Socket.IO实现双向通信时服务器无法向客户端发送数据如何解决
Python Socket.IO 服务端主动向客户端发送数据解决方案
- 首先确保前后端监听与触发的事件名完全匹配,事件名大小写敏感,不要出现拼写错误
- 不要在客户端未完成连接的阶段触发推送,建议先在连接成功回调中测试推送逻辑,服务端参考代码如下:
import socketio import eventlet sio = socketio.Server(cors_allowed_origins="*") app = socketio.WSGIApp(sio) # 监听客户端连接事件 @sio.event def connect(sid, environ): print(f"客户端{sid}已连接") # 连接成功后主动给当前客户端发消息 sio.emit('server_push', {'msg': '这是服务端主动推送的消息'}, to=sid) # 保留原有接收客户端消息的逻辑 @sio.event def client_send(sid, data): print(f"收到客户端{sid}消息:{data}") # 收到消息后可给对应客户端回推信息 sio.emit('server_response', {'reply': f'已收到你的消息:{data}'}, to=sid) if __name__ == '__main__': eventlet.wsgi.server(eventlet.listen(('', 5000)), app)
- 客户端必须对应监听服务端触发的同名事件,参考代码如下:
const socket = io('http://你的服务端地址:5000'); // 监听服务端主动推送的事件,事件名必须和服务端emit的完全一致 socket.on('server_push', (data) => { console.log('收到服务端推送:', data); }); socket.on('server_response', (data) => { console.log('收到服务端回复:', data); }); // 保留原有给服务端发消息的逻辑 socket.emit('client_send', {content: '客户端测试消息'});
- 不同场景的消息发送规则:
- 给指定单个客户端发消息:
emit方法添加to=sid参数,sid为连接时自动生成的客户端唯一标识 - 给所有已连接的客户端广播消息:去掉
to参数即可 - 如果你使用了自定义命名空间,需要在
emit时指定namespace参数,和客户端连接的命名空间保持一致
- 给指定单个客户端发消息:
- 排查依赖版本问题:服务端的
python-socketio包版本需要和客户端socket.io-client包版本兼容,版本不兼容是消息收发异常的高频原因。比如服务端安装v5.x版本的python-socketio时,客户端需要使用v3.x或v4.x版本的socket.io-client。
内容的提问来源于stack exchange,提问作者Andres Torres
相关产品推荐
相关产品推荐

