开发者社区> 问答> 正文

无法从redis message_queue接收事件

我试图发送和接收事件从客户端(运行在一个外部进程)到Flask-SocketIO服务器使用redis作为message_queue,但服务器不接收客户端发出的任何事件。 服务器:

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组成:

version: '3.3'

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

redis-cli监视器输出:

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

服务器没有打印出任何东西,请帮助我! 问题来源StackOverflow 地址:/questions/59380029/flask-socketio-cannot-receive-event-from-redis-message-queue

展开
收起
kun坤 2019-12-29 21:31:59 751 0
1 条回答
写回答
取消 提交回答
  • 我想你对什么是插座感到困惑。输入输出端。您在“客户端”标题下定义的代码不是客户端,而是在服务器上运行并可以代表服务器发出的外部进程。 在我看来,一切都很顺利。这个外部进程通过服务器发送到客户端。您期望服务器上的my_event处理程序将接收此事件,但此事件将以另一种方式进行,客户机将接收此事件。根据您对问题的描述,似乎您没有连接任何客户端,因此消息不会发送到任何地方。 如果希望用Python编写一个合适的客户机,那么可以删除不需要的消息队列,而是使用client或AsyncClient类在Python -socketio包中编写客户机。

    2019-12-29 21:32:11
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Redis集群演化的心路历程——从2.x到3.0时代 立即下载
微博的Redis定制之路 立即下载
云数据库Redis版的开源之路 立即下载