Flask socketIO 发出一系列事件

问题描述

我希望服务器在建立连接后向客户端(React)发出一系列事件,我已经尝试过:

@socketio.on('connect')
def test_connect():
    for i in range(10):
        emit('my response',{'data': 'Connected ' + str(i)})
        time_module.sleep(2)

但事件同时显示在网络浏览器控制台中,就像它们同时到达一样,作为反应我使用:

useEffect(() => {
    const socket = socketIOClient(ENDPOINT);

    socket.on('my response',function (data) {
      console.log('my response: ',data.data);
    })
})

解决方法

您的服务器代码中存在两个潜在问题。

首先,您的示例中的 time_module 是什么?我怀疑这是你正在做的阻塞睡眠。相反,我建议你用socketio.sleep(2)好好睡觉。

第二个问题是您在 connect 事件处理程序中执行此操作。 Socket.IO 服务器会等到您从连接处理程序返回以决定是否接受或拒绝客户端,因此通常您不希望此处理程序花费很长时间运行,因为直到您返回。我建议您将此逻辑移至后台函数。

以下代码解决了这两个问题:

def initial_events():
    for i in range(10):
        emit('my response',{'data': 'Connected ' + str(i)})
        socketio.sleep(2)

@socketio.on('connect')
def test_connect():
    socketio.start_background_task(initial_events)