websocket_asyncio

news2024/12/17 18:36:28

WebSocket 和 asyncio 指南

在这里插入图片描述

简介

本指南涵盖了使用 Python 中的 websockets 库进行 WebSocket 编程的基础知识,以及 asyncio 在异步非阻塞 I/O 中的作用。它提供了构建高效 WebSocket 服务端和客户端的知识,以及 asyncio 的特性和优势。


1. 什么是 WebSocket?

  • WebSocket 是一种全双工通信协议,它通过单个持久连接实现客户端与服务端之间的实时数据交换。
  • 它非常适合需要低延迟和实时通信的应用,例如:
    • 聊天应用
    • 实时流媒体
    • 实时数据推送

WebSocket 的特点:

  1. 全双工通信。
  2. 低延迟数据传输。
  3. 持久连接。

2. 什么是 asyncio

asyncio 是 Python 提供的用于异步编程的库,能够高效处理 I/O 密集型操作。它允许在单线程中同时运行多个任务,而无需阻塞。

主要特性:

  1. 非阻塞 I/O: 执行文件或网络等任务时不会阻塞程序。
  2. 并发: 在不使用线程或进程的情况下高效处理大量任务。
  3. 事件循环: 管理异步任务的调度和执行。
  4. 任务管理: 支持协程、async/await 语法和任务调度(如 asyncio.gatherasyncio.create_task)。

3. 使用 asyncio 编写 WebSocket 服务端

代码示例:

import asyncio
import websockets

# WebSocket 处理函数
async def handle_connection(websocket, path):
    print("新的客户端已连接")
    try:
        async for message in websocket:
            print(f"接收到:{message}")
            await websocket.send(f"回显:{message}")
    except websockets.ConnectionClosed:
        print("客户端断开连接")

# 启动 WebSocket 服务端
start_server = websockets.serve(handle_connection, "localhost", 12345)

# 运行服务端
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

工作原理:

  1. 服务端在 localhost:12345 上监听 WebSocket 连接。
  2. 每个客户端连接由协程 handle_connection() 处理。
  3. 服务端可以异步发送和接收消息。

4. 使用 asyncio 编写 WebSocket 客户端

代码示例:

import asyncio
import websockets

async def client():
    uri = "ws://localhost:12345"
    async with websockets.connect(uri) as websocket:
        await websocket.send("你好,服务端!")
        response = await websocket.recv()
        print(f"服务端回应:{response}")

asyncio.run(client())

工作原理:

  1. 客户端连接到位于 localhost:12345 的 WebSocket 服务端。
  2. 客户端发送一条消息,并等待服务端的回应。

5. asyncio 在 WebSocket 编程中的作用

asyncio 为高效处理 WebSocket 通信提供了基础。以下是它在 WebSocket 服务端和客户端中的支持方式:

关键作用:

  1. 并发: 在服务端中同时处理多个客户端连接。
    • 示例:每个客户端连接作为单独的协程运行(async def)。
  2. 非阻塞 I/O: 执行 I/O 操作(例如发送/接收消息)时不会阻塞其他任务。
  3. 事件循环: 事件循环协调协程的执行,确保响应性。
  4. 任务调度:
    • 使用 asyncio.create_task() 调度后台任务。
    • 使用 asyncio.gather() 并发执行多个任务。

并发 WebSocket 服务端示例:

async def handle_connection(websocket, path):
    async for message in websocket:
        print(f"接收到:{message}")
        await websocket.send(f"回显:{message}")

start_server = websockets.serve(handle_connection, "localhost", 12345)

asyncio.run(start_server)

每个客户端连接在自己的协程中运行,从而支持并发。


6. 使用 WebSocket 和 asyncio 的优势

  1. 可扩展性: 高效处理数千个连接。
  2. 低开销: 避免线程或进程的额外开销。
  3. 响应性: 快速响应 I/O 事件。
  4. 代码简洁: 使用 async/await 编写的异步代码可读性强。

7. 示例工作流:WebSocket 服务端和客户端

服务端:

  • 异步处理客户端连接。
  • 并发处理消息,并返回响应。

客户端:

  • 连接到服务端。
  • 异步发送和接收消息。

8. 常见问题与解决方法

1. 并发处理

  • 使用 asyncio.gather()asyncio.create_task() 管理多个连接。

2. 连接管理

  • 使用 try-except 块优雅地处理连接中断或错误。

3. 安全连接

  • 使用 SSL/TLS,通过提供证书和密钥配置 websockets

9. 真实案例

  1. 聊天应用: 实现实时消息传递。
  2. 实时数据推送: 如体育比分、股票价格。
  3. 协作工具: 文档实时共享编辑。
  4. 流媒体: 音频或视频流。

10. 总结

WebSocket 和 asyncio 的结合为构建实时、可扩展的应用程序提供了强大框架。利用 asyncio 的非阻塞特性,可以高效管理 WebSocket 连接,确保客户端和服务端的实时通信。

进一步阅读:

  • asyncio 官方文档
  • websockets 官方文档

此文档从基础概念到实践应用以及潜在挑战进行了全面介绍,旨在帮助理解如何使用 asyncio 和 WebSocket 进行高效编程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2261201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Java核心技术I》Swing用户界面组件

Swing和模型-视图-控制器设计模式 用户界面组件各个组成部分,如按钮,复选框,文本框或复杂的树控件,每个组件都有三个特征: 内容,如按钮的状态,文本域中的文本。外观,颜色&#xff0c…

如何通过递延型指标预测项目的长期成果?

递延型指标(Deferred Metrics)是指那些并不立即反映或直接影响当前操作、决策或行为的指标,而是随着时间的推移,才逐渐显现出影响效果的指标。这类指标通常会在一段时间后反映出来,或者需要一定的周期才能展现其成果或…

uni-app开发AI康复锻炼小程序,帮助肢体受伤患者康复!

**提要:**近段时间我们收到多个康复机构用户,咨询AI运动识别插件是否可以应用于肢力运动受限患者的康复锻炼中来,插件是可以应用到AI康复锻炼中的,今天小编就为您介绍一下AI运动识别插件在康腹锻炼中的应用场景。 一、康复机构的应…

C++(十八)

前言: 本文依据上一篇,继续对C中的函数进行学习。 一,内联函数。 再执行函数代码时,比不使用函数花费了更多时间,因为总结步骤,传递参数和返回值都很花费时间。 因此,在调试小型函数时&…

如何在 Ubuntu 上安装 NodeBB 并使用 Nginx 反向代理

简介 NodeBB 是一款基于 Node.js 的开源论坛软件,为在线社区提供了现代化和响应式的解决方案。在 Ubuntu Linux 上运行的 NodeBB 利用了操作系统的强大性和灵活性,以提供高性能和可扩展性。它结合了 MongoDB 或 Redis 进行数据库管理,使其能…

【UE5 C++课程系列笔记】09——多播委托的基本使用

目录 多播委托——申明委托 一、DECLARE_MULTICAST_DELEGATE 二、DECLARE_DYNAMIC_MULTICAST_DELEGATE 多播委托——绑定委托 一、Add 二、AddStatic 三、AddRaw 四、AddSP 五、AddUObject 六、Remove 七、RemoveAll 多播委托——执行 上一篇:【UE5 C课程…

车牌识别OCR授权:助力国产化升级,全面提升道路监控效率

政策背景:国产化升级,推动道路监控产业转型 随着国家对信息安全的重视,国内各大公安、政企机构已进入全面升级国产化平台的实施阶段。根据最新的政策要求,公安和政府部门必须在未来三年内完成平台的国产化替换工作。这一举措不仅…

无人机推流直播平台EasyDSS视频技术如何助力冬季森林防火

冬季天干物燥,大风天气频繁,是森林火灾的高发期。相比传统的人力巡查,无人机具有更高的灵敏度和准确性,尤其在夜间或浓雾天气中,依然能有效地监测潜在火源。 无人机可以提供高空视角和实时图像传输,帮助巡…

linux下查看nginx的安装路径

一般会安装在默认位置下:/usr/local/openresty/nginx 或/usr/local/nginx 查看nginx运行进程,mast process 后面一般是nginx 的安装目录 ps -aux|grep nginx执行ls -l /proc/进程号/exe 会打印出安装/运行位置 ps -aux|grep nginx ls -l /proc/进程号/ex…

Python随机抽取Excel数据并在处理后整合为一个文件

本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件,随机从其中选取一部分数据,并将全部文件中随机获取的数据合并为一个新的Excel表格文件的方法。 首先,我们来明确一下本文的具体需求。…

网络基础 - TCP/IP 五层模型

文章目录 一、OSI 参考模型中各个分层的作用1、应用层2、表示层3、会话层4、传输层5、网络层6、数据链路层7、物理层 二、OSI 参考模型通信处理示例三、TCP/IP1、定义2、规范 - RFC(Request For Comment) 一、OSI 参考模型中各个分层的作用 1、应用层 2、表示层 负责设备固有数…

探索Web3:从去中心化应用到全球数字化未来

Web3 是互联网发展的下一步,它通过去中心化的理念重新定义了数字世界。与传统的Web2相比,Web3将数据主权交还给用户,让每个人都可以在没有中介的情况下安全地交换信息和价值。本文将探索Web3的基本概念,去中心化应用(D…

pydub AudioSegment实现音频重采样 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…

uniapp/HBuilder X引入weex报错weex is not defined

出现错误: ‍[⁠ReferenceError⁠]‍ {message: "weex is not defined"} 在www.iconfont.cn把想要的图标放进个人项目中并且下载css文件: 进入HBuilder自己创建的项目中添加一个目录common,添加一个文件free-icon.css 把刚才下载…

音频进阶学习八——傅里叶变换的介绍

文章目录 前言一、傅里叶变换1.傅里叶变换的发展2.常见的傅里叶变换3.频域 二、欧拉公式1.实数、虚数、复数2.对虚数和复数的理解3.复平面4.复数和三角函数5.复数的运算6.欧拉公式 三、积分运算1.定积分2.不定积分3.基本的积分公式4.积分规则线性替换法分部积分法 5.定积分计算…

ActiveMQ 反序列化漏洞CVE-2015-5254复现

文章目录 一、产生原因二、利用条件三、利用过程四、PoC(概念验证)五、poc环境验证使用find搜索vulhub已安装目录打开activeMQ组件查看配置文件端口启动镜像-文件配置好后对于Docker 镜像下载问题及解决办法设置好镜像源地址,进行重启docker查…

主成分分析法大全(包括stata+matlab)

数据简介:主成分分析(Principal Component Analysis,PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。在实际课题中,为了…

qt中tr的使用

在 Qt 中使用 tr 函数对字符串进行翻译时,通常会通过 Qt Linguist 工具来处理翻译。以下是一个基本的步骤说明,展示如何将 QPushButton *btnnew QPushButton(tr("Hello World"),this); 翻译成其他语言,比如中文: 1.创建…

【Unity3D】报错libil2cpp.so找不到问题

mainTemplate.gradle文件末尾添加: **IL_CPP_BUILD_SETUP** 此报错发生在低版本的Unity升级到高版本后,例如Unity2019升级到Unity2021,而Unity2019默认创建的mainTemplate.gradle文件是不包含**IL_CPP_BUILD_SETUP** 因此会导致libil2cpp.so…

GLM4模型详解 - 智谱AI开源大模型全面解析

📚 2024年6月5日,智谱AI在开发者大会上正式开源GLM-4-9B系列大模型。本文将全面解析GLM4的技术特点、部署方案和应用场景。 GLM-4-9B 模型具备了更强大的推理性能、更长的上下文处理能力、多语言、多模态和 All Tools 等突出能力。 “All Tools” 一、模型概述 1.…