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,而是使用 Client
或 AsyncClient
类 在 python-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 容器中 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,而是使用 Client
或 AsyncClient
类 在 python-socketio 包中。