我正在尝试使用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."
服务器未打印任何内容,请帮帮我!
答案 0 :(得分:0)
我认为您对Socket.IO客户端感到困惑。您在“客户端”标题下定义的代码不是客户端,它是在服务器上运行并可以代表其发出的外部进程。
据我所知一切正常。这个外部过程正在通过服务器发送给客户端。您期望服务器上的my_event
处理程序将收到此消息,但是此事件正相反,客户端将收到它。根据对问题的描述,您似乎没有连接任何客户端,因此该消息不会发送到任何地方。
如果您想使用Python编写适当的客户端,则删除不需要的消息队列,而使用python-socketio中的Client
或AsyncClient
类对客户端进行编码包。