【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())
相关推荐
Java后端的Ai之路13 小时前
【Python 教程15】-Python和Web
python
冬奇Lab15 小时前
一天一个开源项目(第15篇):MapToPoster - 用代码将城市地图转换为精美的海报设计
python·开源
二十雨辰17 小时前
[python]-AI大模型
开发语言·人工智能·python
Yvonne爱编码17 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
前端摸鱼匠18 小时前
YOLOv8 环境配置全攻略:Python、PyTorch 与 CUDA 的和谐共生
人工智能·pytorch·python·yolo·目标检测
WangYaolove131418 小时前
基于python的在线水果销售系统(源码+文档)
python·mysql·django·毕业设计·源码
AALoveTouch18 小时前
大麦网协议分析
javascript·python
ZH154558913118 小时前
Flutter for OpenHarmony Python学习助手实战:自动化脚本开发的实现
python·学习·flutter
xcLeigh19 小时前
Python入门:Python3 requests模块全面学习教程
开发语言·python·学习·模块·python3·requests
xcLeigh19 小时前
Python入门:Python3 statistics模块全面学习教程
开发语言·python·学习·模块·python3·statistics