首页 > 解决方案 > 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)

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

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

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

标签: reactjsflasksocket.ioflask-socketio

解决方案


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

首先,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)

推荐阅读