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

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

最新文章

  1. Package Configurations的使用示例
  2. JS中数组Array的用法
  3. hiho#1033 : 交错和
  4. [Express] Level 4: Body-parser -- Post
  5. 1057: [ZJOI2007]棋盘制作 - BZOJ
  6. 说点手动导jar包的细节Referenced Libraries
  7. 处理emacs-org模式TODO的一个脚本
  8. android项目 之 记事本(6)----- 加入手写
  9. js在新页面中返回到上一页浏览的历史位置
  10. 在同一个系统上装两个不同版本的jdk,配置环境变量不起作用,jdk版本的切换问题
  11. Linux下PHP连接MS SQLServer的办法
  12. 获得某个月的天数(java, mysql, oracle)
  13. vue element-ui 分页组件封装
  14. TCP详解——连接建立与断开
  15. android面试题总结加强再加强版(一)
  16. Linux查看端口、进程信息
  17. 【转】C#中base关键字的几种用法
  18. defer 的常用场景
  19. Kafka 0.8 副本同步机制理解
  20. [osg]osg自定义事件的理解

热门文章

  1. MySQL中的DML、DQL和子查询
  2. js 动态添加Table tr,选中与不选中checkbox行数NO的变化
  3. C#异步编程学习笔记之-async和await
  4. JS基础_对象字面量
  5. python之输入一系列整数输出最大值
  6. promise使用的正确方式
  7. cookie、sessionStorage和localStorage区别
  8. Mycat1.6启动报NumberFormatException解决方案(server内存太大)
  9. 创建LEANGOO账号
  10. go语言入门(1)