首页 > 解决方案 > python flask-socketio 服务器收到消息但不触发事件

问题描述

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

test_simple.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 >> ##

标签: pythonflasksocket.ioflask-socketio

解决方案


解决了 - 感谢您的帮助米格尔!问题是软件包版本;我使用的是 Flask 1.1.2 和 Flask-SocketIO 4.3.1,我没有意识到这是一个单独的包,我只尝试更新 Flask(和 socketio-client,但我已经在使用最更新的日期版本)。一旦我也更新到 Flask 2.0.1 和 Flask-SocketIO 5.1.0,它突然开始像我预期的那样工作。现在感觉自己傻了,哈哈


推荐阅读