Flask Socket-IO 让服务器等待客户端回调

Flask Socket-IO Having a server wait for a client callback

我正在使用 flask socket-io 构建一个纯 python 应用程序。目前,我正在尝试让服务器向特定客户端发出事件并在继续之前等待回调。 这是我的 Server.py

import socketio
import eventlet

sio = socketio.Server(async_handlers=False)
app = socketio.WSGIApp(sio)

@sio.event
def connect(sid, environ):
    nm = None
    def namee(name):
        print(name) # this has the value and is trying to assign it to nm
        nonlocal nm
        nm = name
    sio.emit('name_', "name plz", callback=namee)
    print(nm) # this shouldn't be None, but it is
    print(sid, "in lobby")

@sio.event
def disconnect(sid):
    print('disconnect', sid)

if __name__ == '__main__':
    eventlet.wsgi.server(eventlet.listen(('', 5000)), app)

这是我的 client.py

import sys
import socketio

sio = socketio.Client()


@sio.event
def connect():
    print("you have connected to the server")


@sio.event
def connect_error(data):
    print("The connection failed!")


@sio.event
def disconnect():
    print("You have left the server")

@sio.event
def name_(data):
    print("name asked for")
    return "test"

def main():
    sio.connect('http://localhost:5000')
    print('Your sid is', sio.sid)


if __name__ == '__main__':
    main()

我尝试使用 time.sleep() 但这延迟了整个过程。我也试过做一个 while 循环

while nm is None:
    pass

但这会将客户端踢出服务器,一段时间后,服务器崩溃了。

您可以使用 call() 方法代替 emit()

    nm = sio.call('name_', "name plz")
    print(nm)

我建议您将此逻辑移到 connect 处理程序之外。此处理程序只是接受或拒绝连接,不应长时间阻塞。在建立连接后使用的常规处理程序中执行此操作。