You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 15:36:04