python socket.io 坑。
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()
就可以正常退出了,而且暂时没发现问题
python socket.io 坑。的更多相关文章
- 【踩坑】socket.io服务器不能访问
今天在单机测试socket.io服务器时一切正常,但用jar包的方式部署在服务器时发现客户端无法连接. 于是做了一系列排查,如检查端口是否在占用,防火墙有没有开放该端口,阿里云终端是否有开放安全组,本 ...
- Node学习笔记(三):基于socket.io web版你画我猜(二)
上一篇基础实现的功能是客户端canvas作图,导出dataURL从而实现图片信息推送,下面具体讲下服务端的配置及客户端的配置同步 首先先画一个流程图,讲下大概思路 <canvas id=&quo ...
- Python异步IO --- 轻松管理10k+并发连接
前言 异步操作在计算机软硬件体系中是一个普遍概念,根源在于参与协作的各实体处理速度上有明显差异.软件开发中遇到的多数情况是CPU与IO的速度不匹配,所以异步IO存在于各种编程框架中,客户端比如浏览 ...
- nodejs + socket.io + redis 新手上路
最近要更新网站架构了,决定转入 nodejs + socket.io + redis 方式. 战斗刚开始: 网上的文章太松散,我根据各个网友的分享进行整理 ,让大家可以方便上手. 进入node.js之 ...
- Python Socket通信原理
[Python之旅]第五篇(一):Python Socket通信原理 python Socket 通信理论 socket例子 摘要: 只要和网络服务涉及的,就离不开Socket以及Socket编 ...
- Node+Express+MongoDB + Socket.io搭建实时聊天应用
Node+Express+MongoDB + Socket.io搭建实时聊天应用 前言 本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战 ...
- Socket.io 延伸
项目正好用到了即时通讯功能,于是研究到了webSocket技术,后来发现了可以在web.[Android].[iOS]上同时使用的解决方案,那就是SocketIO.其实现原理啥的不做介绍了,直接贴上I ...
- 基于 socket.io, 简单实现多平台类似你猜我画 socket 数据传输
一.前言 socket.io 实现了实时双向的基于事件的通讯机制,是基于 webSocket 的封装,但它不仅仅包括 webSocket,还对轮询(Polling)机制以及其它的实时通信方式封装成了通 ...
- python 浅析IO 模型
协程:遇到IO操作就切换,但是什么时候切回去呢?怎么确定IO操作? 很多程序员可能会考虑使用"线程池"或"连接池"."线程池"旨在减少创建和 ...
随机推荐
- Linux命令-文件管理篇-cat
1.cat 说明 cat 是一个文本文件查看和连接工具.查看一个文件的内容,用cat比较简单,就是cat 后面直接接文件名. 2.使用权限 所有使用者 <!-- more --> 3.ca ...
- Win32汇编之其他指令
汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地 ...
- javascript——创建对象的方式
对象:在JavaScript中,对象是拥有属性和方法的数据. JavaScript自定义对象方式有以下7种:直接创建方式.对象初始化器方式.构造函数方法.prototype原型方式.混合的构造函数/原 ...
- 【原创】数据库基础之Sqlite
官方:https://www.sqlite.org/index.html 简介 SQLite is a C-language library that implements a small, fast ...
- C#异步编程学习笔记之-async和await
一.异步方法介绍(async和await):如果使用async修饰符将某种方法指定为异步方法,即启用以下两种功能.1.标记的异步方法可以使用await来指定暂停点.await运算符通知编译器异步方法: ...
- 服务端相关知识学习(一)之什么是zookeeper
什么是zookeeper zookeeper是分布式协调服务,可以在分布式系统中共享配置.协调锁资源.提供命名服务那分布式协调服务又是个什么东西呢?首先我们来看“协调”是什么意思.在一个并发的环境里, ...
- Java虚拟机-------垃圾回收机机制
概述 jvm中的堆图 在了解 垃圾回收器 之前,首先得了解一下垃圾回收器的几个名词. 1. 吞吐量CPU 用于运行用户代码的时间与 CPU 总消耗时间的比值.比如说虚拟机总运行了 100 分钟,用户代 ...
- React+Redux+Dva学习
Redux提供一些api来管理数据,并且只能通过它提供的方式来修改.Redux包括三个部分:store, action,reducer. store:是一个规范的state,就像一个有条理的数据库,R ...
- 记录FTPClient超时处理的相关问题(转)
https://www.cnblogs.com/dasusu/p/10006899.html 记录 FTPClient 超时处理的相关问题 apache 有个开源库:commons-net,这个开 ...
- element-ui el-table表格排序sortable参数解析
表格组件的排序功能,点击排序表头可以进行升序和降序进行排序 页面代码,基本上排序的参数都使用了 <el-table :data="tableData" style=" ...