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
相关产品推荐
相关产品推荐

