python socket.io 坑。
2024-09-02 12:22:45
python下star最高的是https://github.com/miguelgrinberg/python-socketio
是flask作者写的。client server都有了,而且还提供了async版本。但是怎么说呢,用起来有坑!
1文档太简略。
2 它的客户端和服务器端,在win下启动后,都不能及时响应键盘ctrl+C退出。要等很久很久。
而把它包装进Process,然后
p.daemon = True
设置为守护进程,这样主进程退出,就能正常退出了。
以服务器端为例,客户端同理
from multiprocessing import Process
import signal
import sys import eventlet
import socketio clients = {} def run(port):
sio = socketio.Server()
app = socketio.WSGIApp(sio, static_files={
'/': {'content_type': 'text/html', 'filename': 'index.html'}
}) @sio.event
def connect(sid, environ):
print('connect ', sid) @sio.event
def disconnect(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('主进程启动') def signal_handler(signal, frame):
print('关闭从进程')
#p.terminate()
print('主进程退出')
sys.exit(0) signal.signal(signal.SIGINT,signal_handler)
while True:
pass
但是client 属于强退。clietn退出后N久,才回在服务器端显示:
“ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。”
但是,不论客户端还是服务器端,都没有响应到disconnect, 因为根本就不是正常退出的
而且用Process 的方法,还有个问题,就是占用主机CPU,主进程始终在死循环。直接站走1个CPU,太坑了。
解决方法:
sio = socketio.Client() @sio.event
def connect():
print("I'm connected!")
sio.emit('auth_mobile', {'ip': get_host_ip(), 'hardware': hardware_info}) @sio.event
def disconnect():
print("I'm disconnected!") try:
sio.connect(f'http://{ip_admin}:{port}')
#sio.wait()
except socketio.exceptions.ConnectionError:
print('连接admin失败')
不使用sio.wait()
就可以正常退出了,而且暂时没发现问题
最新文章
- Package Configurations的使用示例
- JS中数组Array的用法
- hiho#1033 : 交错和
- [Express] Level 4: Body-parser -- Post
- 1057: [ZJOI2007]棋盘制作 - BZOJ
- 说点手动导jar包的细节Referenced Libraries
- 处理emacs-org模式TODO的一个脚本
- android项目 之 记事本(6)----- 加入手写
- js在新页面中返回到上一页浏览的历史位置
- 在同一个系统上装两个不同版本的jdk,配置环境变量不起作用,jdk版本的切换问题
- Linux下PHP连接MS SQLServer的办法
- 获得某个月的天数(java, mysql, oracle)
- vue element-ui 分页组件封装
- TCP详解——连接建立与断开
- android面试题总结加强再加强版(一)
- Linux查看端口、进程信息
- 【转】C#中base关键字的几种用法
- defer 的常用场景
- Kafka 0.8 副本同步机制理解
- [osg]osg自定义事件的理解