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

Flask-SocketIO服务端无法通过轮询与Python-SocketIO客户端通信

问题原因分析及解决方案

1. 服务端死循环阻塞主线程,导致服务无法正常处理连接

服务端代码中,你在全局作用域直接调用了loop_counter()函数,这个无限循环会直接阻塞主线程,导致后续的路由定义、SocketIO事件注册甚至sio.run()启动服务的代码都无法执行。即使你测试时客户端能连接,也说明这行代码的执行逻辑存在致命问题。

修复方式:

将循环发送逻辑改为SocketIO后台任务,避免阻塞主线程:

from flask import Flask
from flask_socketio import SocketIO
import time

app = Flask(__name__)
app.config['SECRET_KEY'] = 'ztyzjbnb'

sio = SocketIO(app, cors_allowed_origins="*")

def loop_counter(json_data):
    while True:
        sio.emit('main_ctrl', json_data)
        time.sleep(1)  # 增加延迟,避免高频发送耗尽资源

@app.route('/')
def hello_world():
    return 'Hello World!'

@sio.on('connect establish event')
def handle_connect_establish_socket(msg):
    print('connection established with message : "%s"' % msg)

@sio.on('connect')
def handle_connect():
    # 客户端连接后启动后台广播任务
    sio.start_background_task(loop_counter, {"one": 1, "two": 2, "three": 3})

if __name__ == '__main__':
    sio.run(app, host='0.0.0.0', port=5000, debug=True)

2. Python客户端未监听服务端发送的main_ctrl事件

服务端发送的事件是main_ctrl,但你的Python客户端只监听了response、connect等事件,没有对应main_ctrl的监听函数,因此即使服务端发消息,客户端也无法接收。

修复方式:

在Python客户端中添加main_ctrl事件的监听:

import socketio
import time

sio = socketio.Client()

@sio.event
def connect():
    print('Connection established')
    sio.emit('connect establish event', {'data': 'connection established...'})  # 和JS客户端保持一致的事件名

# 新增监听服务端的main_ctrl事件
@sio.event
def main_ctrl(data):
    print(f'Received main_ctrl data: {data}')

@sio.event
def disconnect():
    print('Disconnected from server')

@sio.event
def connect_error(data):
    print(f'Connection error: {data}')

try:
    sio.connect('http://localhost:5000', transports=['polling'])
    print('Connected to server using polling transport')
    while True:
        time.sleep(1)
except Exception as e:
    print(f'Failed to connect to server: {e}')
finally:
    sio.disconnect()
    print('Disconnected from server')

3. 客户端事件名不匹配(优化项)

JS客户端连接后发送的是connect establish event事件,而你的Python客户端发送的是message事件,服务端仅监听了connect establish event,导致服务端收不到Python客户端的连接确认消息。虽然不影响消息接收,但建议保持事件名一致以规范交互。

版本兼容性说明

你使用的依赖版本是兼容的:

  • Flask-SocketIO 4.2.1 对应 python-socketio 4.x、python-engineio 3.x,与你当前依赖版本匹配,无需调整。

内容的提问来源于stack exchange,提问作者elven mac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:24:51