对 Python Websockets 库全方位详解

news2025/4/9 5:23:37

一、WebSocket 简介

WebSocket 是一种基于 TCP 的协议,支持全双工通信(服务器和客户端可以同时发送消息),适用于实时性要求高的场景(如聊天、实时数据监控、在线游戏等)。与 HTTP 不同,WebSocket 连接一旦建立,会保持持久化,避免了 HTTP 轮询的开销。


二、Python 的 websockets

websockets 是 Python 中用于构建 WebSocket 服务器和客户端的异步库,基于 asyncio 实现,支持高并发和低延迟通信。

安装
pip install websockets

三、完整代码示例

1. WebSocket 服务器
import asyncio
import websockets
from datetime import datetime

# 保存所有活跃的客户端连接
connected_clients = set()

async def handle_client(websocket, path):
    """
    处理单个客户端连接
    """
    # 将新客户端添加到集合
    connected_clients.add(websocket)
    try:
        async for message in websocket:
            # 广播消息给所有客户端
            timestamp = datetime.now().strftime("%H:%M:%S")
            broadcast_message = f"[{timestamp}] {message}"
            await broadcast(broadcast_message)
    except websockets.exceptions.ConnectionClosed:
        print("客户端断开连接")
    finally:
        # 客户端断开后移除
        connected_clients.remove(websocket)

async def broadcast(message):
    """
    向所有连接的客户端广播消息
    """
    if connected_clients:
        await asyncio.gather(
            *[client.send(message) for client in connected_clients]
        )

async def start_server():
    """
    启动 WebSocket 服务器
    """
    async with websockets.serve(handle_client, "localhost", 8765):
        print("服务器已启动,监听端口 8765...")
        await asyncio.Future()  # 永久运行

if __name__ == "__main__":
    asyncio.run(start_server())
2. WebSocket 客户端
import asyncio
import websockets

async def client():
    """
    WebSocket 客户端实现
    """
    async with websockets.connect("ws://localhost:8765") as websocket:
        # 创建两个任务:一个接收消息,一个发送消息
        receive_task = asyncio.create_task(receive_messages(websocket))
        send_task = asyncio.create_task(send_messages(websocket))
        await asyncio.gather(receive_task, send_task)

async def receive_messages(websocket):
    """
    接收服务器消息
    """
    async for message in websocket:
        print(f"\n收到消息: {message}")

async def send_messages(websocket):
    """
    发送用户输入的消息
    """
    while True:
        message = await asyncio.get_event_loop().run_in_executor(None, input, "输入消息 (输入 'exit' 退出): ")
        if message.strip().lower() == 'exit':
            break
        await websocket.send(message)

if __name__ == "__main__":
    asyncio.run(client())

四、代码详解

服务器端
  1. connected_clients:使用集合保存所有活跃连接,便于广播。
  2. handle_client
    • 接受新连接并添加到集合。
    • 循环接收客户端消息,收到后调用 broadcast 广播。
    • 处理连接断开异常,确保客户端被移除。
  3. broadcast:使用 asyncio.gather 并发向所有客户端发送消息。
  4. start_server:启动服务器并永久运行。
客户端
  1. client:连接服务器并启动收发任务。
  2. receive_messages:循环接收服务器消息并打印。
  3. send_messages:读取用户输入,发送到服务器(run_in_executor 用于异步处理阻塞的 input)。

五、运行与测试

  1. 启动服务器
    python server.py
    
  2. 启动多个客户端
    python client.py
    
  3. 测试:在任一客户端输入消息,所有客户端都会收到广播。

六、高级用法

  1. 消息协议:可定义 JSON 格式的消息,添加类型字段(如 {"type": "chat", "content": "Hello"})。
  2. 认证:在连接时验证 Token(通过 path 参数或首次握手消息)。
  3. 心跳机制:定期发送 Ping/Pong 保持连接活跃。
  4. 集成 FastAPI:结合 ASGI 框架提供 HTTP + WebSocket 混合服务。

七、应用场景

  1. 实时聊天应用
  2. 多人在线游戏
  3. 股票行情推送
  4. 物联网设备监控

八、总结

通过 websockets 库,可以轻松构建高性能的实时应用。本文提供的代码示例覆盖了服务器和客户端的基本实现,注释详细,可直接扩展用于实际项目。

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

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

相关文章

pytorch中Dropout

Dropout 是一种常用的正则化技术,用于防止神经网络过拟合。PyTorch 提供了 nn.Dropout 层来实现这一功能。 基本用法 torch.nn.Dropout(p0.5, inplaceFalse) 参数说明: p (float): 每个元素被置为0的概率(默认0.5) inplace (b…

【玩泰山派】2、制作buildroot镜像,并烧录

文章目录 前言制作buildroot镜像过程搭建环境(docker版)下载泰山派开发的sdk利用制作的镜像和下载的sdk去启动开发docker容器编译buildroot镜像 参考 前言 泰山派官方提供了不少现成的镜像 但是都买了泰山派了,肯定是想自己编译折腾下&…

初阶数据结构--树

1. 树的概念与结构 树是⼀种⾮线性的数据结构,它是由 n(n>0) 个有限结点组成⼀个具有层次关系的集合。把它叫做 树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。 有⼀个特殊的结点,称…

安装gpu版本的dgl

1.先去网址,找到对应版本的dgl,然后下载到本地。 dgl-whl下载地址 我的是python 3.8 ,cuda 11.6. windows 2.在虚拟环境里 输入 pip install E:\dgl-1.0.2cu116-cp38-cp38-win_amd64.whl (因为我下载到E盘里了) 这样GPU版本的d…

5天速成ai agent智能体camel-ai之第1天:camel-ai安装和智能体交流消息讲解(附源码,零基础可学习运行)

嗨,朋友们!👋 是不是感觉AI浪潮铺天盖地,身边的人都在谈论AI Agent、大模型,而你看着那些密密麻麻的代码,感觉像在读天书?🤯 别焦虑!你不是一个人。很多人都想抓住AI的风…

FPGA——FPGA状态机实现流水灯

一、引言 在FPGA开发中,状态机是一种重要的设计工具,用于处理具有时间顺序的事件。本文将详细介绍如何使用状态机实现一个LED流水灯的效果。 二、状态机概述 状态机(FSM)是一种行为模型,用于表示系统在不同状态下的…

晶晨S905-S905L-S905LB_S905M2通刷_安卓6.0.1_16S极速开机_线刷固件包

晶晨S905-S905L-S905LB_S905M2通刷_安卓6.0.1_16S极速开机_线刷固件包 线刷方法:(新手参考借鉴一下) 刷机工具版本请用2.2.0以上,导入固件后,刷机工具右侧两个擦除打勾,然后点开始。插上刷机神器&#xf…

构建第一个ArkTS应用:Hello World之旅

# 构建第一个ArkTS应用:Hello World之旅 在鸿蒙应用开发的领域中,ArkTS语言为我们提供了强大而便捷的开发方式。今天,就让我们一起踏上构建第一个ArkTS应用——Hello World的奇妙旅程。 ## 一、创建ArkTS工程 1. 首先,我们要使用…

第十五届单片机模拟考试III

题目 题目不长 ,功能也不难,一道水题 按键功能 S4界面切换,S5 功能切换,在不同界面转换不同的功能,定义两个标志位记录即可。 S9复位,回到初始状态,记得界面也得回到初始的信号界面&#xff0…

测试:正交法设计测试用例

目录 一、什么是正交法 二、利用正交表设计测试用例 正交法设计测试用例的步骤 一、什么是正交法 正交法的目的是为了减少测试用例的数量,让尽可能少的用例覆盖两两组合。认识正交表。 最简单的正交表是L4(2^3),含意如下: “L”代表正…

[ctfshow web入门] web5

前置知识 引用博客:phps的利用 当服务器配置了 .phps 文件类型时,访问 .phps 文件会以语法高亮的形式直接显示 PHP 源代码,而不是执行它。.phps被作为辅助开发者的一种功能,开发者可以通过网站上访问xxx.phps直接获取高亮源代码 …

Qt基本框架(2)

本篇主要介绍如何设置窗口,以及在窗口中添加按钮 本文部分ppt、视频截图原链接:[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1. Qt简单框架 2. 通过QMainWindow实现简单界面 QMainWindow是构建主窗口应用的核心类,通过合理设计…

基于javaweb的SpringBoot图片管理系统图片相册系统设计与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

用HTML.CSS.JavaScript实现一个贪吃蛇小游戏

目录 一、引言二、实现思路1. HTML 结构2. CSS 样式3. JavaScript 逻辑 三、代码实现四、效果展示 一、引言 贪吃蛇是一款经典的小游戏,曾经风靡一时。今天,我们将使用 HTML、CSS 和 JavaScript 来实现一个简单的贪吃蛇小游戏。通过这个项目&#xff0c…

JVM——模型分析、回收机制

方法区:存储已被虚拟机加载的类元数据信息(元空间) 堆:存放对象实例,几乎所有的对象实例都在这里分配内存 虚拟机栈:虚拟机栈描述的是|ava方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局…

7. 记忆(Memory)机制:让AI拥有“短期记忆”与“长期记忆”

引言:当AI学会"记住你" 2025年某银行智能客服因无法记住用户身份,每次对话都要求重复验证,引发大量投诉。引入LangChain 记忆系统后,客户满意度提升62%。本文将基于MemorySaver与FAISS本地存储,教你构建符合…

前后端分离下,Spring Boot 请求从发起到响应的完整执行流程

以下是前后端分离架构下,Spring Boot 请求从发起到响应的完整执行流程,结合你提出的所有问题,按真实执行顺序和职责链条重新整理所有核心概念、结构、关键类、数据转换点和典型代码示例: 一、前端发起请求(步骤1-2&…

【文献阅读】Vision-Language Models for Vision Tasks: A Survey

发表于2024年2月 TPAMI 摘要 大多数视觉识别研究在深度神经网络(DNN)训练中严重依赖标注数据,并且通常为每个单一视觉识别任务训练一个DNN,这导致了一种费力且耗时的视觉识别范式。为应对这两个挑战,视觉语言模型&am…

spring-cloud-alibaba-nacos-config使用说明

一、核心功能与定位 Spring Cloud Alibaba Nacos Config 是 Spring Cloud Alibaba 生态中的核心组件之一,专为微服务架构提供动态配置管理能力。它通过整合 Nacos 的配置中心功能,替代传统的 Spring Cloud Config,提供更高效的配置集中化管理…

C# Winform 入门(9)之如何封装并调用dll

封装dll 首先创建 .Net平台 类库 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _09.Encapsulation_dll {public class Program{/// <summary>/// 求两个double类型的数值的和/// &l…