【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())
相关推荐
巨量HTTP30 分钟前
Python爬虫动态换IP实战,彻底解决IP403封禁、限流问题(附完整代码)
爬虫·python·tcp/ip·http
晓子文集1 小时前
Tushare接口文档:指数成分和权重(index_weight)
大数据·数据库·python·金融·量化投资
小大宇1 小时前
python pandas dataFrame sqlAlchemy案例
python·pandas
淼澄研学1 小时前
Python进阶实战:深入解析推导式与生成器等5大核心特性
开发语言·python
xlrqx2 小时前
商丘家电清洗培训零基础学习需掌握哪些要点零基础到底能不能学
python·学习
卷无止境2 小时前
Python虚拟环境江湖:从venv到uv,如何避开依赖冲突的坑
后端·python
玉鸯2 小时前
Agent Harness 工程核心架构拆解与 300 行代码实现
python·agent
米码收割机2 小时前
【Python】Django 电子设备商城系统(源码+说明文档)[独一无二]
开发语言·python·django
互联网中的一颗神经元2 小时前
小白python入门 - 38. 动态内容:接口优先与自动化扫盲
开发语言·python·自动化
卷无止境2 小时前
模块与包:Python 代码组织的两层逻辑
后端·python