Python Flask-socketio 服务器接收消息但不触发事件



我正在使用flask和socketio构建一个服务器-客户端通信系统。下面是它的简化版本,它复制了我遇到的问题。基本上,客户端可以连接到服务器,可以发送消息并接收回确认,但是这些消息似乎不会触发服务器上的处理程序函数。在下面的示例中,我希望服务器在日志中有"RECEIVED:{}{}",因为它应该调用handle_message方法,但没有任何内容,尽管它明确表示已接收到"test"事件。我尝试了一些不同的迭代和版本,试图弄清楚发生了什么,但我不知道是什么导致了这个问题。如果您能提供任何帮助,我们将不胜感激!谢谢

testrongimple.py:

import sys
import time
from flask import Flask
from flask_socketio import SocketIO
import socketio as sio
from socketio import Client
app = Flask(__name__)
socket = SocketIO(app, engineio_logger=True, logger=True)
@socket.on('test')  ## try decorator as .on_event isn't working
def handle_message(*args, **kwargs):
print('RECEIVED: ', args, kwargs)
app.logger.error(f'RECEIVED: {args}, {kwargs}')
socket.emit('reply', 'hello client')
return 'hello client'
def message_callback(*args, **kwargs):
print('CALLBACK: ', args, kwargs)
def startup_server():
#app = Flask(__name__)
#socket = SocketIO(app, cors_allowed_origins="*",
#                  engineio_logger=True, logger=True)
#socket.on_event('test', handle_message)   # this doesn't work either
#socket.on_event('message', handle_message)
socket.run(app, host='127.0.0.1', port=8001, debug=True,
use_reloader=False)
def startup_client():
socket = Client(logger=True, engineio_logger=True)
socket.connect('http://127.0.0.1:8001')
socket.on('reply', message_callback)
socket.emit('test', data='hello world', callback=message_callback)
time.sleep(5)
#socket.send(data='hello message', callback=message_callback)
#time.sleep(5)
socket.disconnect()
if __name__ == '__main__':
if sys.argv[1] == 'predictor':
startup_client()
else:
startup_server()

服务器日志:

python3 test_simple.py aggregator

Server initialized for gevent.
54Pavf_I3leodKsoAAAA: Sending packet OPEN data {'sid': '54Pavf_I3leodKsoAAAA', 'upgrades': ['websocket'], 'pingTimeout': 20000, 'pingInterval': 25000}
54Pavf_I3leodKsoAAAA: Received request to upgrade to websocket
54Pavf_I3leodKsoAAAA: Upgrade to websocket successful
54Pavf_I3leodKsoAAAA: Received packet MESSAGE data 0
54Pavf_I3leodKsoAAAA: Sending packet MESSAGE data 0{"sid":"xH33UEQVeWzMXauFAAAB"}
54Pavf_I3leodKsoAAAA: Received packet MESSAGE data 21["test","hello world"]
received event "test" from xH33UEQVeWzMXauFAAAB [/]
### << expecting 'RECEIVED: {} {}' here >> ###
54Pavf_I3leodKsoAAAA: Sending packet MESSAGE data 31["",400]

客户端日志:

python3 test_simple.py predictor

Server initialized for gevent.
Attempting polling connection to http://127.0.0.1:8001/socket.io/?transport=polling&EIO=4
Polling connection accepted with {'sid': '54Pavf_I3leodKsoAAAA', 'upgrades': ['websocket'], 'pingTimeout': 20000, 'pingInterval': 25000}
Engine.IO connection established
Sending packet MESSAGE data 0
Attempting WebSocket upgrade to ws://127.0.0.1:8001/socket.io/?transport=websocket&EIO=4
WebSocket upgrade was successful
Received packet NOOP data 
Received packet MESSAGE data 0{"sid":"xH33UEQVeWzMXauFAAAB"}
Namespace / is connected
Emitting event "test" [/]
Sending packet MESSAGE data 21["test","hello world"]
Received packet MESSAGE data 31["",400]
Received ack [/]
CALLBACK:  ('', 400) {}  ## << expected to receive 'hello client' >> ##
## << no 'reply' event trigger >> ##

解决了它-感谢您的帮助Miguel!问题在于软件包版本;我使用的是Flask 1.1.2和Flask SocketIO 4.3.1,我没有意识到这是一个单独的包,我只尝试过更新Flask(和SocketIO客户端,但我已经使用了迄今为止更新最多的版本(。一旦我更新到Flask 2.0.1和Flask SocketIO 5.1.0,它突然开始像我预期的那样工作。现在我觉得很笨,哈哈

最新更新