个人技术总结——flask-socketio框架
一、技术概述
这个技术是做什么的
Flask-SocketIO 使 Flask 应用程序能够访问客户端和服务器之间的低延迟双向通信。客户端应用程序可以使用 Javascript,C ++,Java 和 Swift 中的任何 SocketIO 官方客户端库或任何兼容的客户端来建立与服务器的永久连接。
学习该技术的原因
项目的消息模块需要socket全双工即时通信。
技术的难点
资料较少,官网,github上都是全英文介绍。
二、技术详述
如何实现和使用该技术
安装
直接使用 pip 来安装:
pip install flask-socketio
要求
Flask-SocketIO 兼容 Python 2.7 和 Python 3.3+。可以从以下三个选项中选择此程序包所依赖的异步服务:
- eventlet 性能最佳,支持长轮询和 WebSocket 传输。
- gevent 在许多不同的配置中得到支持。gevent 包完全支持长轮询传输,但与 eventlet 不同,gevent 没有本机 WebSocket 支持。要添加对 WebSocket 的支持,目前有两种选择:安装 gevent-websocket 包为 gevent 增加 WebSocket 支持,或者可以使用带有 WebSocket 功能的 uWSGI Web 服务器。gevent 的使用也是一种高性能选项,但略低于 eventlet。
- 也可以使用基于 Werkzeug 的 Flask 开发服务器,但需要注意的是,它缺乏其他两个选项的性能,因此它只应用于简单的开发环境。此选项仅支持长轮询传输。
扩展会根据安装的内容自动检测要使用的异步框架。优先考虑 eventlet,然后是 gevent。对于 gevent 中的WebSocket 支持,首选 uWSGI,然后是 gevent-websocket。如果既未安装 eventlet 也未安装 gevent,则使用 Flask 开发服务器。
如果使用多个进程,则进程使用消息队列服务来协调诸如广播之类的操作。支持的队列是 Redis,RabbitMQ以及 Kombu 软件包支持的任何其他消息队列 。
在客户端,官方 Socket.IO Javascript 客户端库可用于建立与服务器的连接。还有使用 Swift,Java 和 C ++ 编写的官方客户端。非官方客户端也可以工作,只要它们实现 Socket.IO协议。
三、技术使用中遇到的问题和解决过程
flask-socketio并没有很好的集成websocket,但他良好的集成了js的基于websocket的一个扩展库。所以在前端调用时候需要注意。
其次遇到的一个问题就是,用户两两之间通信和用户和服务器之间两两通信需要对服务器进行额外区分。用户两两通信采用的是框架中的一个 room字段实现,顾名思义,每个用户有各自单独的room,可以接收来自其他用户发送的消息,消息带有发送者的相关信息,服务器对他们在进行区分,最终良好的实现在用户的界面上。
四、总结
如果后端的采用的是flask框架,flask-socketio不失为一个非常优秀的即时通信框架。
五、参考文献、参考博客(标题、作者、链接)
greyli,《flask开发与实战应用》