繁体   English   中英

Flask Socket-IO 和 React socket.io-client,客户端不接收来自“emit”的消息

[英]Flask Socket-IO and React socket.io-client, client doesn't receive messages from 'emit

我想从另一个线程向客户端(React JS)发送消息(因为在那里我开始从 pika 开始基本的消费消息并阻止 Flask 应用程序)。 这是我在客户端的简单代码:

const socket = io.connect('ws://127.0.0.1:5000',{transports: ['websocket'], secure: true, port: '5000'});

useEffect(()=> {
    socket.emit("echo", "echo");
}, [])

socket.on('echoresponse', (data) => {
    console.log(data);
});


socket.on('update_page', (data) => {
    console.log(data);
});

当服务器收到回声时,它会回复并且一切正常。 但是当我尝试从 send_result_in_thread() 发出时,客户端什么也没收到。 我的服务器端(缺少一些 rabbitmq pika 代码)

    clients = []
    app = Flask(__name__)
    socketIo = SocketIO(app, async_mode='eventlet', cors_allowed_origins="*")
    eventlet.monkey_patch()
    app.debug = True
    app.host = 'localhost'
    app.debug = True
    app.host = 'localhost'
    
 def send_result_in_thread(cli, message):
    for client in cli:
            socketIo.emit('update_page', message, room=client)
            print('sending message "{}" to client {}'.format(message.decode("utf-8"), client))
    
@socketIo.on("echo")
def echo( message):
     emit('echoresponse', "I'm alive")
    
@socketIo.on('connect')
  def handle_connect():
      print('Client connected')
      clients.append(request.sid)
    
    
@socketIo.on('disconnect')
def handle_disconnect():
     print('Client disconnected')
     clients.remove(request.sid)
    
if __name__ == '__main__':
    consumer = consumer.Consumer()
    t = threading.Thread(target=consumer.run, name="run", args=(clients, ))
    t.daemon = True
    t.start()
    socketIo.run(app, host='0.0.0.0', port='5000',
                     debug=True)

另一个线程:

class Consumer():
    def __init__(self):
        self.clients = []
        #and some more code for rabbitmq

    def got_result(self, ch, method, properties, body):
        print("CLIENTS from thread:" + str(self.clients))
        socketIo.start_background_task(send_result_in_thread, self.clients, body)

    def run(self, clients):
        self.clients = clients
        self.channel.basic_consume(self.queue_name, self.got_result)
        self.channel.start_consuming()

我在这里发现了类似的问题并用作参考https://stackoverrun.com/ru/q/12599436但它无助于解决问题。 Client_id 成功传递给线程,调用了 send_result_in_thread 但客户端没有收到消息。 我不知道为什么。 提前致谢。

终于我找到了问题所在。 每个线程都有自己的 socketIo 变量,因此消息不会发送到客户端。 我的解决方案:主要是:

t = threading.Thread(target=consumer.run, name="run", args=(clients, socketIo))

运行中:

self.socketIo = socketIo

在 got_result 中:

performer.socketIo.start_background_task(performer.send_result_in_thread, self.clients, self.socketIo, body.decode("utf-8"))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM