使用Flask-SocketIO无法接收Postman发送的消息问题求助
Flask-SocketIO与Postman连接无法接收消息的问题解决
我尝试使用Python的Flask-SocketIO与Postman进行连接,但无法读取Postman发送的"hello"消息,报错信息如下:
File "C:\Users\w\AppData\Local\Programs\Python\Python37\lib\site-packages\engineio\packet.py", line 65, in decode
self.packet_type = int(encoded_packet[0])
ValueError: invalid literal for int() with base 10: 'h'
从报错信息能看出,服务端试图将消息"hello"的首字符解码为整数类型的消息标识,最终导致解析失败。
我的代码
from flask import Flask, render_template,jsonify from flask_socketio import SocketIO, emit app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' socketio = SocketIO() socketio.init_app(app, cors_allowed_origins='*') @socketio.on('connect') def index(): return render_template('index.html') @socketio.on('my_event') def handle_my_custom_event(json): print('received json: ' + str(json)) socketio.emit('my_response', json) @socketio.on('connect') def test_connect(): print('Client connected') @socketio.on('disconnect') def disconnect_msg(): print('client disconnected.') @socketio.on('my_event') def mtest_message(message): print(message) emit('my_response', {'data': message['data'], 'count': 1}) @socketio.on('message') def handle_message(data): print('received message: ' + data) if __name__ == '__main__': socketio.run(app,host="0.0.0.0",port=8081,debug=True,allow_unsafe_werkzeug=True)
问题原因与解决方法
核心原因
Postman发送的纯文本"hello"不符合Engine.IO协议的消息格式。Flask-SocketIO基于Engine.IO协议运行,要求消息必须按协议规定的格式封装,不能直接发送原始文本。
解决步骤
Postman发送规范
- 确认Postman建立的是SocketIO类型连接(而非普通WebSocket)
- 发送消息时选择
Event类型,事件名填写message(对应代码中@socketio.on('message')的处理函数) - 在Payload区域填入带引号的合法JSON字符串:
"hello"
代码优化
代码中存在两个被@socketio.on('connect')装饰的函数,这会导致只有最后一个函数生效,建议合并为一个:@socketio.on('connect') def test_connect(): print('Client connected') # 若不需要在连接时返回模板,可删除原index函数,connect事件无需返回模板
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

