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

时间:2019-12-17 18:22:36

标签: python flask redis flask-socketio

我正在尝试使用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-compose的docker容器中运行:

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."

服务器未打印任何内容,请帮帮我!

1 个答案:

答案 0 :(得分:0)

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

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

如果您想使用Python编写适当的客户端,则删除不需要的消息队列,而使用python-socketio中的ClientAsyncClient类对客户端进行编码包。