Flask Socket-IO: сервер ожидает обратного вызова клиента. - PullRequest
0 голосов
/ 17 июня 2020

Я создаю чистое приложение python с flask socket-io. В настоящее время я пытаюсь настроить сервер на отправку события определенному клиенту c и дождаться обратного вызова, прежде чем двигаться дальше. Это мой 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 (), но это задержало весь процесс. Я также пробовал сделать какое-то время l oop

while nm is None:
    pass

, но клиент отключился от сервера, а через некоторое время сервер упал.

1 Ответ

0 голосов
/ 18 июня 2020

Вы можете использовать метод call() вместо emit().

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

Тем не менее, я рекомендую вам переместить этот logi c за пределы обработчика connect. Этот обработчик должен просто принять или отклонить соединение, он не должен блокировать на длительный период времени. Сделайте это в обычном обработчике, который вы используете после установки соединения.

...