是flask作者写的。client server都有了,而且还提供了async版本。但是怎么说呢,用起来有坑!
1文档太简略。
2 它的客户端和服务器端,在win下启动后,都不能及时响应键盘ctrl+C退出。要等很久很久。
而把它包装进Process,然后
p.daemon = True
设置为守护进程,这样主进程退出,就能正常退出了。
以服务器端为例,客户端同理
from multiprocessing importProcessimportsignalimportsysimporteventletimportsocketio
clients={}defrun(port):
sio=socketio.Server()
app= socketio.WSGIApp(sio, static_files={'/': {'content_type': 'text/html', 'filename': 'index.html'}
})
@sio.eventdefconnect(sid, environ):print('connect', sid)
@sio.eventdefdisconnect(sid):print('disconnect', clients[sid])print('启动服务器', port)
eventlet.wsgi.server(eventlet.listen(('', port)), app)if __name__ == '__main__':
p=Process(target=run,args=(9090,))
p.daemon = True
p.start()#p.terminate()
print('主进程启动')defsignal_handler(signal, frame):print('关闭从进程')
#p.terminate()print('主进程退出')
sys.exit(0)
signal.signal(signal.SIGINT,signal_handler)whileTrue:pass
但是client 属于强退。clietn退出后N久,才回在服务器端显示:
“ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。”
但是,不论客户端还是服务器端,都没有响应到disconnect, 因为根本就不是正常退出的
而且用Process 的方法,还有个问题,就是占用主机CPU,主进程始终在死循环。直接站走1个CPU,太坑了。
解决方法:
sio =socketio.Client()
@sio.eventdefconnect():print("I'm connected!")
sio.emit('auth_mobile', {'ip': get_host_ip(), 'hardware': hardware_info})
@sio.eventdefdisconnect():print("I'm disconnected!")try:
sio.connect(f'http://{ip_admin}:{port}')#sio.wait()
exceptsocketio.exceptions.ConnectionError:print('连接admin失败')
不使用sio.wait()
就可以正常退出了,而且暂时没发现问题