websockets 和 socketio 的比较
websockets
websockets
在 github 中的描述如下,简而言之,websockets
是基于asyncio
实现websocket
。websockets
的特点是使用简单并且保证高鲁棒性。
websockets
is a library for building WebSocket servers and clients in Python with a focus on correctness and simplicity.Built on top of
asyncio
, Python’s standard asynchronous I/O framework, it provides an elegant coroutine-based API.
websockets
的优点是:
- 简单:使用
websocket
只需要了解msg = await ws.recv()
和await ws.send(msg)
;websockets
负责管理连接,以便可以专注于应用程序。 - 健壮:
websockets
为生产而构建。 - 质量:
websockets
经过严格测试。 - 性能:内存使用是可配置的。用 C 编写的扩展加速了昂贵的操作。它针对 Linux、macOS 和 Windows 进行了预编译,并针对每个系统和 Python 版本进行 package 。
websockets
不适用于以下场景:
- 如果项目使用回调函数而不是协程。
websockets
创建是为了提供基于协程的 API 来管理 Python 中的 WebSocket 连接。 - 如果项目需要在 http/websocket 场景下使用,
websockets
并不是很适用,websockets
主要是支持RFC6455
规范,而在RFC7692
规范中补充了关于websocket
的压缩方案。websockets
对 HTTP 的支持很少——只足以支撑 HTTP 的健康检查。
集成第三方应用
此外,在阅读websockets
的文档中,发现websockets
的确是主推其易用性和灵活性,很容易就可以上手构建服务端和客户端,但是它和第三方包的集成度比较低。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qMPF4roA-1666584023169)(https://cdn.jsdelivr.net/gh/ColorlessCube/images@main/blog/16347844013451634784401338.png)]
socketio
Socket.IO
是一种传输协议,可在客户端(通常是 Web 浏览器)和服务器之间实现基于事件的实时双向通信。客户端和服务器组件的官方实现是用JavaScript
编写的,python-socketio
是Python
实现。此外,Socket.IO
还提供其他语言的支持。因此,通常开发场景中,websocket
经常为前后端通信或跨平台通信,因此Socket.IO
提供了很好的支持。
[外链图片转存中…(img-howPUkE3-1666584023173)]
此外,阅读Socket.IO
的文档可以发现,server 端支持很多拓展功能。
namespace 和 room
Namespace:Socket.IO 协议支持多个逻辑连接,全部复用在同一个物理连接上。客户端可以通过在每个连接上指定不同的命名空间来打开多个连接。命名空间由客户端指定为跟在主机名和端口之后的路径名。例如,连接到 http://example.com:8000/chat 将打开到命名空间 /chat 的连接
Room:为了方便服务器向相关客户端组发送事件,应用程序可以将其客户端放入“房间”,然后将消息寻址到这些房间。
namespace
和room
的概念,使得Socket.IO
能够更好地进行消息的分发。客户端能够通过连接到不同的namespace
来完成不同主题信息的获取。服务器端可以通过将客户端放进不同的room
,将客户端分组,根据分组分发不同的消息。
集成消息队列
使用分布式应用程序时,通常需要从多个进程访问Socket.IO
的功能。有两个特定的用例:
- 一旦后台作业完成,使用工作队列的应用程序(如
celery
)可能需要向客户端发出事件。执行这项任务最方便的地方是处理这项工作的工作进程。 - 高度可用的应用程序可能希望使用
Socket.IO
服务器的水平扩展来处理大量并发客户端。
作为上述问题的解决方案,可以将 Socket.IO 服务器配置为连接到Redis
或RabbitMQ
等消息队列,与其他相关的Socket.IO
服务器或辅助工作者进行通信。而Socket.IO
提供了很好的集成方法,以Redis
为例。
# socketio.Server class
mgr = socketio.RedisManager('redis://')
sio = socketio.Server(client_manager=mgr)# socketio.AsyncServer class
mgr = socketio.AsyncRedisManager('redis://')
sio = socketio.AsyncServer(client_manager=mgr)
集成 ASGI 服务器
Socket.IO
可以与 ASGI 兼容的 Web 服务器部署应用程序,例如 Flask、Gunicorn
。
sio = socketio.Server(async_mode='eventlet', cors_allowed_origins='*')
app = Flask(__name__)# 将 socketio 服务器集成到现有的 wsgi 应用中
app.wsgi_app = socketio.WSGIApp(sio, app.wsgi_app)
异步高可用性
Socket.IO
支持通过gevent、eventlet
来实现异步高可用性,可以通过以下方式设置。如果不采用上述方式,也可以使用标准多线程的方式来支持高并发场景。
sio = socketio.Server(async_mode='gevent')
sio = socketio.Server(async_mode='eventlet')
sio = socketio.Server(async_mode='threading')
总结
通过阅读官方文档,对Python
的websockets
包和socketio
包进行了简单说明。
可以看出,websockets
的特点是易用性,专注于websocket
的处理,能够快速搭建服务,并根据具体场景对服务进行改造,使其符合开发的预期。
而socketio
则已经做了很多基础性工作,能够很好地与一些主流的技术集成,开发者只需要完成一些简单的配置即可。
websockets 和 socketio 的比较相关推荐
- Cocos2dx发展历程
文章目录 Cocos2dx发展历程 Python版本 Cocos2d-iPhone 其他版本的移植 Cocos2d-x 从v2.0到v3.0 Cocos产品 Cocos Cocos2d-x Cocos ...
- codeblock socket 编译错误_在 Go 中使用 Websockets 和 Socket.IO
注 - 本教程是使用 Go 1.9 版和 googollee/go-socket.io 编写的 Websockets 我觉得非常有趣,在应用程序之间通信中使用标准 RESTful API 方案之外,它 ...
- 什么是socketIO?
SocketIO是在客户端和服务端之间建立的双向通信数据交换技术,底层使用EngineIO.SocketIO的的客户端使用Engine.IO-Client,服务端使用Engine.IO实现. Sock ...
- SocketIO介绍及用法
转载自:https://zhuanlan.zhihu.com/p/422664879 SocketIO是在客户端和服务端之间建立的双向通信数据交换技术,底层使用EngineIO.SocketIO的的客 ...
- websockets_如何将WebSockets与AWS API Gateway和Lambda一起使用来构建实时应用程序
websockets by Janitha Tennakoon 通过詹妮莎·特纳库恩 如何将WebSockets与AWS API Gateway和Lambda一起使用来构建实时应用程序 (How to ...
- JavaScript 工作原理之五-深入理解 WebSockets 和带有 SSE 机制的HTTP/2 以及正确的使用姿势(译)...
原文请查阅这里,略有改动,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第五章. 现在 ...
- Nginx与websocket或socketio的负载均衡
前言 在之前写过使用socketio来实时向用户推送站内信springboot使用netty-socketio推送消息,在前天上线时遇到了一个问题,后端在生产上启动了,消息也能启动,但是前段页面是直接 ...
- WebSockets[翻译]
2019独角兽企业重金招聘Python工程师标准>>> 原文:WebSockets WebSockets WebSockets是一个可以被基于允许双向全双工通信协议的Web浏览器使用 ...
- HTML5(WebSockets)的脆弱性?
尽管还不是官方的标准, HTML5 的使用和影响力成长迅速. 无论是 Web.移动.或甚至SOA, 似乎都有一个HTML5的整合战略.然而,HTML5不仅仅是一个原有的标记语言的更新,因为它包含了其他 ...
- 《Java Web高级编程——涵盖WebSockets、Spring Framework、JPA H
2019独角兽企业重金招聘Python工程师标准>>> <Java Web高级编程--涵盖WebSockets.Spring Framework.JPA Hibernate和S ...
最新文章
- Error:Execution failed for task ':app:mergeDebugResources'. Error: java.lang.RuntimeException: Som
- ISSCC 2021前瞻,智能传感器和IoT端是大势所趋 | AI日报
- js 前端操作的分页路由设计
- 删除系统Win7系统盘越来越小,系统盘清理技巧
- 按文件类型获取其图标
- ISV客户博客系列:iVoteSports通过Windows Azure扩展它的面向棒球的移动游戏应用程序...
- win7下安装linux(CentOS)过程中遇到的问题总结
- EasyDarwin开源流媒体服务器如何实现按需推送直播的
- 研磨设计模式之简单工厂模式
- java字体推荐_最适合编程的10大字体推荐
- 采样频率和带宽的关系_磁共振成像带宽
- UWB定位算法比较TDOA和TWR究竟哪个好
- IntelliJ IDEA 配置Jetty启动项目
- 路由器虚拟服务器wan端口设置,tplink路由器WAN口设置怎么设置?
- 中国大陆已有IB学校243所
- 字节入职福利太香了!7月最新Java面经已更新
- 论文阅读 - On the efficacy of old features for the detection of new bots - CCF B
- 微信公众号添加Word文档附件教程_公众号添加Excel、PDF、PPT、Zip等附件教程
- 图像增强(拉普拉斯锐化增强)
- 2018年Android源码下载记录