python socketio_python socket.io 坑。

是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()

就可以正常退出了,而且暂时没发现问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值