【websocket】websocket-client 与 websockets

websocket-client

websocket-client 是 websocket 客户端,提供了对ws低级API的访问。通过导入 websocket 库使用,websocket 库是基于事件驱动的设计模式,通过定义回调函数来处理接收到的消息、错误和连接关闭等事件。

优势:

  • 兼容多个 Python 版本,包括 Python 2.7 和 Python 3.x。
  • 简单易用,入门门槛较低。
  • 提供了基本的 WebSocket 功能,可以满足一般需求。

劣势:

  • 功能相对较少,不支持一些高级特性,如异步操作和性能优化。
python 复制代码
"""用 websocket 创建长连接"""
import time

import websocket
from gevent import thread


def on_message(ws, message):
    # 处理收到的消息
    print("Received: " + message)


def on_error(ws, error):
    # 处理错误
    print("Error: " + str(error))


def on_close(ws):
    # 关闭连接
    print("Connection closed")


def on_open(ws):
    # 连接成功后的操作
    def run(*args):
        # 发送心跳包或其他持续性操作
        while True:
            ws.send("Ping")
            time.sleep(1)  # 每隔一秒发送一次

    thread.start_new_thread(run, ())


if __name__ == "__main__":
    # 创建 WebSocket 连接
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp(
        'ws://your-websocket-url',
        on_message=on_message,
        on_error=on_error,
        on_close=on_close
    )
    ws.on_open = on_open

    # 运行 WebSocket 客户端
    ws.run_forever()

websockets

websockets 具有 server端和 client端,采用异步操作模式,与 asyncio 模块无缝集成,可以实现高性能的 WebSocket 服务器和客户端。

python版本仅支持3.6及更高版本

优势:

  • 高性能和可扩展性
  • 提供了丰富的特性:支持心跳包、自定义协议和 SSL/TLS 加密等高级功能。

劣势:

  • 不兼容 Python 2.x 版本。
python 复制代码
"""服务端"""
import asyncio
import websockets


async def handle(ws, path):
    name = await ws.recv()
    print(f"接收: {name}")

    greeting = f"已收到 {name}!"
    await ws.send(greeting)
    print(f"发送: {greeting}")


if __name__ == '__main__':
    s = websockets.serve(handle, "127.0.0.1", 9451)

    event_loop = asyncio.get_event_loop()
    event_loop.run_until_complete(s)
    event_loop.run_forever()
python 复制代码
"""客户端"""
import asyncio
import websockets


async def hello():
    uri = "ws://127.0.0.1:9451"
    async with websockets.connect(uri) as websocket:
        name = input("发送: ")

        await websocket.send(name)
        greeting = await websocket.recv()
        print(f"接收: {greeting}")


if __name__ == '__main__':
    event_loop = asyncio.get_event_loop()
    event_loop.run_until_complete(hello())
相关推荐
VidDown7 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
死磕音视频9 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林9 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
pride.li11 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
databook11 小时前
用 Pydantic AI 从零搭建一个能干活的 AI Agent
人工智能·python
康小旺11 小时前
把 markitdown 做成 Windows 桌面版:拖进文档就出 Markdown,附 233MB→64MB 打包裁剪全过程
python
启观川12 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法
南笙北梦12 小时前
本地开源大模型多轮对话显存泄漏排查与修复实录
python
小羊没烦恼!12 小时前
如何在IIS6,7中部署ASP.NET网站?
数据库·后端·python·web安全·asp.net
钱栈up13 小时前
扫完 3.5 万文件后,我发现了 521 组散落的同名文件
爬虫·python·数据分析