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 坑。的更多相关文章

  1. 【踩坑】socket.io服务器不能访问

    今天在单机测试socket.io服务器时一切正常,但用jar包的方式部署在服务器时发现客户端无法连接. 于是做了一系列排查,如检查端口是否在占用,防火墙有没有开放该端口,阿里云终端是否有开放安全组,本 ...

  2. Node学习笔记(三):基于socket.io web版你画我猜(二)

    上一篇基础实现的功能是客户端canvas作图,导出dataURL从而实现图片信息推送,下面具体讲下服务端的配置及客户端的配置同步 首先先画一个流程图,讲下大概思路 <canvas id=&quo ...

  3. Python异步IO --- 轻松管理10k+并发连接

    前言   异步操作在计算机软硬件体系中是一个普遍概念,根源在于参与协作的各实体处理速度上有明显差异.软件开发中遇到的多数情况是CPU与IO的速度不匹配,所以异步IO存在于各种编程框架中,客户端比如浏览 ...

  4. nodejs + socket.io + redis 新手上路

    最近要更新网站架构了,决定转入 nodejs + socket.io + redis 方式. 战斗刚开始: 网上的文章太松散,我根据各个网友的分享进行整理 ,让大家可以方便上手. 进入node.js之 ...

  5. Python Socket通信原理

    [Python之旅]第五篇(一):Python Socket通信原理   python Socket 通信理论 socket例子 摘要:  只要和网络服务涉及的,就离不开Socket以及Socket编 ...

  6. Node+Express+MongoDB + Socket.io搭建实时聊天应用

    Node+Express+MongoDB + Socket.io搭建实时聊天应用 前言 本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战 ...

  7. Socket.io 延伸

    项目正好用到了即时通讯功能,于是研究到了webSocket技术,后来发现了可以在web.[Android].[iOS]上同时使用的解决方案,那就是SocketIO.其实现原理啥的不做介绍了,直接贴上I ...

  8. 基于 socket.io, 简单实现多平台类似你猜我画 socket 数据传输

    一.前言 socket.io 实现了实时双向的基于事件的通讯机制,是基于 webSocket 的封装,但它不仅仅包括 webSocket,还对轮询(Polling)机制以及其它的实时通信方式封装成了通 ...

  9. python 浅析IO 模型

    协程:遇到IO操作就切换,但是什么时候切回去呢?怎么确定IO操作? 很多程序员可能会考虑使用"线程池"或"连接池"."线程池"旨在减少创建和 ...

随机推荐

  1. django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

    CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...

  2. ubuntu 系统升级

    1.更新软件源和软件 $ sudo apt-get update && sudo apt-get dist-upgrade 2.安装update-manager-core $ sudo ...

  3. go intall的使用

    1.首先GOPATH路径指向src的上级目录 2.设置GOBIN路径指向bin目录 3.查看环境配置 4.go install 在src目录下 5.完成 6.pkg ide编译运行一下自动生成

  4. Codeforces 1238G. Adilbek and the Watering System

    传送门 最关键的想法就是每个位置一定用的是当前能用的最便宜的水,因为到后面可能有更便宜的 然后其他还没用上的水我们也留着,假装此时已经买了,但是如果发现后面有更优的再反悔也不迟 每相邻两个朋友之间我们 ...

  5. weblogic连接池

    1.在 使用JDBC连接池的过程中,最常见的一个问题就是连接池泄漏问题.一个池里面的资源是有限的,应用用完之后应该还回到池中,否则池中的资源会被耗尽. WebLogic Server提供了一个Inac ...

  6. C#键盘事件

    一: protected override void OnKeyDown(KeyEventArgs e) { if (e.Key==Key.Enter) { sendAppToServer(); } ...

  7. 搭建自己的框架WedeNet(四)

    WedeNet2018.Web-UI层:结构如下: 首先,在Controller中定义BaseController,以便加入统一处理逻辑,如下: using log4net; using System ...

  8. linux命令详解——xargs

    1. 简介 之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如: find /sbin -perm +700 |ls -l     ...

  9. 静态static最基础的知识

    static静态: 常见修饰的内容: 1.变量: 修饰变量时,叫静态变量或类变量.此变量为类所有随着虚拟机加载类是而加载入方法区,此静态变量为该类所有对象共享,在内存中只有一个副本,它 当且仅当 类的 ...

  10. 2019-2020-1 20199319《Linux内核原理与分析》第一周作业

    一.Linux系统简介 通过实验一了解了Linux 的历史,Linux与windows之间的区别以及学习Linux的方法.因为一直用的都是windows系统,习惯了图形界面,而Linux是通过输入命令 ...