问题描述
我希望服务器在建立连接后向客户端(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)