websockets

websockets在 github 中的描述如下,简而言之,websockets是基于asyncio实现websocketwebsockets的特点是使用简单并且保证高鲁棒性。

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的优点是:

  1. 简单:使用websocket只需要了解msg = await ws.recv()await ws.send(msg)websockets负责管理连接,以便可以专注于应用程序。
  2. 健壮websockets为生产而构建。
  3. 质量websockets经过严格测试。
  4. 性能:内存使用是可配置的。用 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-socketioPython实现。此外,Socket.IO还提供其他语言的支持。因此,通常开发场景中,websocket经常为前后端通信或跨平台通信,因此Socket.IO提供了很好的支持。

[外链图片转存中…(img-howPUkE3-1666584023173)]

此外,阅读Socket.IO的文档可以发现,server 端支持很多拓展功能。

namespace 和 room

Namespace:Socket.IO 协议支持多个逻辑连接,全部复用在同一个物理连接上。客户端可以通过在每个连接上指定不同的命名空间来打开多个连接。命名空间由客户端指定为跟在主机名和端口之后的路径名。例如,连接到 http://example.com:8000/chat 将打开到命名空间 /chat 的连接

Room:为了方便服务器向相关客户端组发送事件,应用程序可以将其客户端放入“房间”,然后将消息寻址到这些房间。

namespaceroom的概念,使得Socket.IO能够更好地进行消息的分发。客户端能够通过连接到不同的namespace来完成不同主题信息的获取。服务器端可以通过将客户端放进不同的room,将客户端分组,根据分组分发不同的消息。

集成消息队列

使用分布式应用程序时,通常需要从多个进程访问Socket.IO的功能。有两个特定的用例:

  • 一旦后台作业完成,使用工作队列的应用程序(如celery)可能需要向客户端发出事件。执行这项任务最方便的地方是处理这项工作的工作进程。
  • 高度可用的应用程序可能希望使用Socket.IO服务器的水平扩展来处理大量并发客户端。

作为上述问题的解决方案,可以将 Socket.IO 服务器配置为连接到RedisRabbitMQ等消息队列,与其他相关的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')

总结

通过阅读官方文档,对Pythonwebsockets包和socketio 包进行了简单说明。

可以看出,websockets的特点是易用性,专注于websocket的处理,能够快速搭建服务,并根据具体场景对服务进行改造,使其符合开发的预期。

socketio则已经做了很多基础性工作,能够很好地与一些主流的技术集成,开发者只需要完成一些简单的配置即可。

websockets 和 socketio 的比较相关推荐

  1. Cocos2dx发展历程

    文章目录 Cocos2dx发展历程 Python版本 Cocos2d-iPhone 其他版本的移植 Cocos2d-x 从v2.0到v3.0 Cocos产品 Cocos Cocos2d-x Cocos ...

  2. codeblock socket 编译错误_在 Go 中使用 Websockets 和 Socket.IO

    注 - 本教程是使用 Go 1.9 版和 googollee/go-socket.io 编写的 Websockets 我觉得非常有趣,在应用程序之间通信中使用标准 RESTful API 方案之外,它 ...

  3. 什么是socketIO?

    SocketIO是在客户端和服务端之间建立的双向通信数据交换技术,底层使用EngineIO.SocketIO的的客户端使用Engine.IO-Client,服务端使用Engine.IO实现. Sock ...

  4. SocketIO介绍及用法

    转载自:https://zhuanlan.zhihu.com/p/422664879 SocketIO是在客户端和服务端之间建立的双向通信数据交换技术,底层使用EngineIO.SocketIO的的客 ...

  5. websockets_如何将WebSockets与AWS API Gateway和Lambda一起使用来构建实时应用程序

    websockets by Janitha Tennakoon 通过詹妮莎·特纳库恩 如何将WebSockets与AWS API Gateway和Lambda一起使用来构建实时应用程序 (How to ...

  6. JavaScript 工作原理之五-深入理解 WebSockets 和带有 SSE 机制的HTTP/2 以及正确的使用姿势(译)...

    原文请查阅这里,略有改动,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第五章. 现在 ...

  7. Nginx与websocket或socketio的负载均衡

    前言 在之前写过使用socketio来实时向用户推送站内信springboot使用netty-socketio推送消息,在前天上线时遇到了一个问题,后端在生产上启动了,消息也能启动,但是前段页面是直接 ...

  8. WebSockets[翻译]

    2019独角兽企业重金招聘Python工程师标准>>> 原文:WebSockets WebSockets WebSockets是一个可以被基于允许双向全双工通信协议的Web浏览器使用 ...

  9. HTML5(WebSockets)的脆弱性?

    尽管还不是官方的标准, HTML5 的使用和影响力成长迅速. 无论是 Web.移动.或甚至SOA, 似乎都有一个HTML5的整合战略.然而,HTML5不仅仅是一个原有的标记语言的更新,因为它包含了其他 ...

  10. 《Java Web高级编程——涵盖WebSockets、Spring Framework、JPA H

    2019独角兽企业重金招聘Python工程师标准>>> <Java Web高级编程--涵盖WebSockets.Spring Framework.JPA Hibernate和S ...

最新文章

  1. 如何利用 C# 爬取「猫眼电影:热映口碑榜」及对应影片信息!
  2. http get post 请求
  3. mysql jdbc 创建存储过程_mysql JDBC 调用存储过程
  4. 项目管理(1):备战pmp
  5. python与android交互,Android客户端与Python服务器端的简单通信
  6. linux的常用操作——用户的添加、删除和查看
  7. c++输出txt格式循环一组数据后换行再循环一次_numpy、pandas以及用pandas做数据分析的案例...
  8. 机器学习-ID3决策树算法(附matlab/octave代码)
  9. 开心消消乐h5版游戏案例分享
  10. Biopython -- Parsing BLAST output
  11. ADNI数据库数据集下载权限申请
  12. on后面使用and和where的区别
  13. 什么是数据分析报告,主要有什么价值?
  14. 2020年度个人总结--一个前端技术LD的年终盘点
  15. VSCode 居然是个娱乐软件?让你 high 到爆的几款插件
  16. 基于jsp+mysql+ssm妇女联合会管理系统-计算机毕业设计
  17. 嵌入式:万字详解通信接口设计
  18. window的onload()的使用
  19. 主数据标准化项目阶段划分、实施难点及应对措施经验分享
  20. 精美PPT模板分享,可用来丰富自己的PPT

热门文章

  1. 将 MySQL 数据库恢复到某个时间点
  2. 猿创征文|国产数据库之OceanBase详解安装和使用
  3. Mirth Connect 第一章 快速安装
  4. 获取 jquery 版本号
  5. 关于tcp/udp网络调试助手错误提示
  6. 线性代数系列(八)--线性代数和图论
  7. openwrt 问题四 9531编译解决方法
  8. 阿里矢量图标的三种使用方式整理(uniapp)
  9. 四川信息职业技术学院计算机多媒体技术,成都市计算机多媒体技术最好学校在哪...
  10. FME转换器参考手册目录汉化索引