websockets库使用(基于Python)

主要参考资料:

【Python】websockets库的介绍及用法: https://blog.csdn.net/qq_53871375/article/details/135920231

python模块websockets,浏览器与服务器之间的双向通信: https://blog.csdn.net/randy521520/article/details/134752051

目录

  • websockets库
    • [创建 WebSocket 服务器](#创建 WebSocket 服务器)
    • [创建 WebSocket 客户端](#创建 WebSocket 客户端)
    • 广播消息
    • [SSL/TLS 加密](#SSL/TLS 加密)

websockets库

websockets库 是一个基于 asyncio 的 Python 库,旨在提供简单易用的 WebSockets 服务器和客户端功能。有如下特性:

  • 简单易用:提供简洁的 API,方便快速上手。
  • 基于 asyncio:利用 Python 的 asyncio 库实现异步 I/O 操作,支持高并发。
  • 全双工通信:支持在单个连接上同时进行数据发送和接收。
  • 支持多种协议:兼容 WebSocket 协议,支持 SSL/TLS 加密。
  • 灵活扩展:支持自定义协议和中间件,方便扩展功能。

创建 WebSocket 服务器

可以使用 websockets.serve 创建一个简单的 WebSocket 服务器:

websockets.serve(): 这个函数负责创建并启动一个WebSocket服务器。

websocket.recv(): 这个函数是一个协程函数,用于从WebSocket接收消息。

websocket.send(): 这个函数是一个协程函数,用于向WebSocket发送消息。

python 复制代码
import asyncio
import websockets
 
async def hello(websocket, path):
    name = await websocket.recv()
    print(f"< {name}")
    
    greeting = f"Hello {name}!"
    
    await websocket.send(greeting)
    print(f"> {greeting}")
 
start_server = websockets.serve(hello, "localhost", 8765)
 
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

创建 WebSocket 客户端

可以使用 websockets.connect 创建一个简单的 WebSocket 客户端:

websockets.connect(): 这个函数负责创建一个 WebSocket 客户端。

websocket.close(): 关闭 WebSocket 连接。

websockets.exceptions: 提供了WebSocket特定的异常。如:ConnectionClosed、InvalidHandshake、InvalidOrigin等。

python 复制代码
import asyncio
import websockets
 
async def hello():
    uri = "ws://localhost:8765"
    async with websockets.connect(uri) as websocket:
        await websocket.send("Hello, World!")
        response = await websocket.recv()
        print(f"< {response}")
 
asyncio.get_event_loop().run_until_complete(hello())

广播消息

可以实现消息广播功能,将消息发送给所有连接的客户端:

python 复制代码
import asyncio
import websockets
 
connected_clients = set()
 
async def handler(websocket, path):
    connected_clients.add(websocket)
    try:
        async for message in websocket:
            await asyncio.wait([client.send(message) for client in connected_clients])
    finally:
        connected_clients.remove(websocket)
 
start_server = websockets.serve(handler, "localhost", 8765)
 
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

SSL/TLS 加密

可以为 WebSocket 服务器添加 SSL/TLS 加密,确保数据传输安全:

python 复制代码
import asyncio
import ssl
import websockets
 
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context.load_cert_chain(certfile="path/to/certfile", keyfile="path/to/keyfile")
 
async def echo(websocket, path):
    async for message in websocket:
        await websocket.send(message)
 
start_server = websockets.serve(echo, "localhost", 8765, ssl=ssl_context)
 
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
相关推荐
学测绘的小杨7 小时前
CompassFusion:一个从 GNSS 到 GNSS/INS 组合导航的独立工程包
python
zzzzzz31013 小时前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
雪隐14 小时前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python
兵慌码乱1 天前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot1 天前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海1 天前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱1 天前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽2 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码2 天前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱2 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理