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
处理程序之外。此处理程序只是接受或拒绝连接,不应长时间阻塞。在建立连接后使用的常规处理程序中执行此操作。
我正在使用 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
处理程序之外。此处理程序只是接受或拒绝连接,不应长时间阻塞。在建立连接后使用的常规处理程序中执行此操作。