Flask-SocketIO 无法从 Redis message_queue 接收事件

Flask-SocketIO cannot receive event from redis message_queue

我正在尝试使用 redis 作为 message_queue 从客户端(运行 在外部进程上)向 Flask-SocketIO 服务器发送和接收事件,但服务器没有收到任何事件客户端发出。

服务器:

from flask_socketio import SocketIO, Namespace
from flask import Flask


class MyNamespace(Namespace):
   def on_my_event(self, data):
        print('Data received:', data)

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO()
socketio.on_namespace(MyNamespace('/my_namespace'))
socketio.init_app(app, message_queue='redis://127.0.0.1:6379')

if __name__ == '__main__':
    app.run()

客户:

from flask_socketio import SocketIO
import time

socketio = SocketIO(message_queue='redis://127.0.0.1:6379')


def test():
    count = 0
    while True:
        print('Data:', count)
        socketio.emit('my_event', {'data': count},
                       namespace='/my_namespace',
                       broadcast=True)
        count += 1
        time.sleep(2)


if __name__ == '__main__':
    test()

Redis 服务器 运行 在 docker 容器中 docker-compose:

version: '3.3'

services:
    redis:
        build: ./redis
        volumes: 
          - ./redis/data:/data
        expose: 
          - 6379
        ports: 
          - 6379:6379

redis-cli monitor输出:

1576594467.587035 [0 172.22.0.1:38534] "PUBLISH" "flask-socketio" "\x80\x03}q\x00(X\x06\x00\x00\x00methodq\x01X\x04\x00\x00\x00emitq\x02X\x04\x00\x00\x00dataq\x03}q\x04h\x03K\x83sX\b\x00\x00\x00callbackq\x05NX\x04\x00\x00\x00roomq\x06NX\b\x00\x00\x00skip_sidq\aNX\x05\x00\x00\x00eventq\bX\b\x00\x00\x00my_eventq\tX\t\x00\x00\x00namespaceq\nX\r\x00\x00\x00/my_namespaceq\x0bX\a\x00\x00\x00host_idq\x0cX \x00\x00\x0053331c21d78649cea28d1ad9e1010179q\ru."
1576594469.590627 [0 172.22.0.1:38534] "PUBLISH" "flask-socketio" "\x80\x03}q\x00(X\x06\x00\x00\x00methodq\x01X\x04\x00\x00\x00emitq\x02X\x04\x00\x00\x00dataq\x03}q\x04h\x03K\x84sX\b\x00\x00\x00callbackq\x05NX\x04\x00\x00\x00roomq\x06NX\b\x00\x00\x00skip_sidq\aNX\x05\x00\x00\x00eventq\bX\b\x00\x00\x00my_eventq\tX\t\x00\x00\x00namespaceq\nX\r\x00\x00\x00/my_namespaceq\x0bX\a\x00\x00\x00host_idq\x0cX \x00\x00\x0053331c21d78649cea28d1ad9e1010179q\ru."
1576594471.593944 [0 172.22.0.1:38534] "PUBLISH" "flask-socketio" "\x80\x03}q\x00(X\x06\x00\x00\x00methodq\x01X\x04\x00\x00\x00emitq\x02X\x04\x00\x00\x00dataq\x03}q\x04h\x03K\x85sX\b\x00\x00\x00callbackq\x05NX\x04\x00\x00\x00roomq\x06NX\b\x00\x00\x00skip_sidq\aNX\x05\x00\x00\x00eventq\bX\b\x00\x00\x00my_eventq\tX\t\x00\x00\x00namespaceq\nX\r\x00\x00\x00/my_namespaceq\x0bX\a\x00\x00\x00host_idq\x0cX \x00\x00\x0053331c21d78649cea28d1ad9e1010179q\ru."

服务器没有打印出任何东西,请帮助我!

我认为您对什么是 Socket.IO 客户感到困惑。您在 "The client" 标题下定义的代码不是客户端,它是在服务器上运行并可以代表它发出的外部进程。

据我所知一切正常。这个外部进程通过服务器发送给客户端。您期望服务器上的 my_event 处理程序会收到此事件,但此事件是相反的,客户端会收到它。根据您对问题的描述,您似乎没有连接任何客户端,因此该消息不会发送到任何地方。

如果你想在 Python 中编写一个合适的客户端,则删除不需要的消息 queue,而是使用 ClientAsyncClient 类 在 python-socketio 包中。