什么是WebSocket?在Python中如何应用?

WebSocket介绍与使用

  • WebSocket 简介
  • WebSocket的握手机制
  • WebSocket的特点
  • WebSocket的优缺点
  • 优点
  • 缺点‌
  • WebSocket与HTTP对比
  • 通信模式
  • 连接状态
  • 数据传输效率
  • 使用场景
  • WebSocket的应用场景
  • WebSocket 在爬虫工作中的情况
  • Python 中 WebSocket 的使用案例
  • 安装websockets库
  • WebSocket 服务器示例
  • WebSocket 客户端示例
  • 运行结果
  • WebSocket 简介

    WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议。它使得客户端和服务器之间的数据交换变得更加简单,只需要建立一个连接,就可以实时地双向传输数据。

    WebSocket的握手机制

    ‌握手阶段‌:客户端通过HTTP协议向服务器发送一个特殊的请求,请求头中包含Upgrade: websocket和Connection: Upgrade等字段,表明客户端希望升级到WebSocket协议。服务器收到请求后,如果支持WebSocket,会返回一个状态码为101的响应,表示协议切换成功,此时握手完成,连接进入数据通信阶段。
    ‌数据通信阶段‌:一旦握手成功,客户端和服务器之间建立了一个持久的双向连接,可以随时发送和接收数据。数据以帧的形式传输,可以是文本数据或二进制数据。

    WebSocket的特点

    ‌全双工通信‌:WebSocket允许客户端和服务器之间进行双向数据传输,服务器可以主动向客户端推送数据。
    ‌轻量级协议‌:WebSocket协议的数据格式比较轻量,通信效率高。
    ‌支持二进制数据‌:除了文本数据,WebSocket还支持发送和接收二进制数据,如图片、视频等。
    ‌无同源限制‌:客户端可以与任意服务器通信,无需考虑跨域问题。

    WebSocket的优缺点

    优点

    节省资源‌:WebSocket只需要一次HTTP握手,后续可以通过一个持久连接进行双向通信,减少了HTTP请求的开销。
    实时通信‌:服务器可以主动向客户端推送数据,实现实时的双向通信。

    缺点‌

    ‌安全性问题‌:由于WebSocket基于TCP协议,如果网络环境不安全,可能会存在数据泄露的风险。建议使用WSS协议(即WebSocket Secure)来确保数据的安全传输。

    WebSocket与HTTP对比

    通信模式

    1. WebSocket
    2. 支持全双工(Full-Duplex)通信,即客户端和服务器之间可以相互发送消息,而不需要等待请求。
    3. 一旦连接建立,除非手动关闭或遇到异常,连接会一直保持,形成长连接。
    4. HTTP
    5. 采用请求-响应模型,客户端(例如浏览器)发送请求到服务器,服务器处理后返回响应。
    6. 每次客户端要获取数据时,必须发起一个新的请求,形成短连接。虽然HTTP/1.1引入了持久连接(Keep-Alive),但每个请求仍然是独立的。

    连接状态

    1. WebSocket
    2. 一旦连接建立,客户端和服务器之间可以保持连接状态,允许双方实时传递数据,而无需每次重新建立连接。
    3. 支持状态保持,服务器可以记住客户端的状态。
    4. HTTP
    5. 是无状态协议,服务器不会保存客户端的状态。
    6. 每次请求都是独立的,服务器不会记住之前的请求。

    数据传输效率

    1. WebSocket
    2. 连接建立后,不需要每次传输头部信息,数据传输非常高效。
    3. 采用二进制帧传输数据,相对于文本协议,它的数据传输效率更高。
    4. HTTP
    5. 每次请求都需要包含头部信息、方法、状态码等元数据,开销相对较大。
    6. 文本协议,数据传输效率相对较低。

    使用场景

    1. WebSocket
    2. 适用于需要实时更新数据的场景,例如实时聊天、在线游戏、金融交易系统、实时数据推送(如股票市场数据)等。
    3. HTTP
    4. 适用于页面加载、文件下载、REST API 调用等一次性请求和响应的场景。
    5. 也适用于以轮询(Polling)方式进行定期请求以获取更新的场景,但这种方式相对低效,且会消耗较多资源。

    WebSocket的应用场景

    ‌实时聊天应用‌:如在线聊天室、即时通讯工具等,WebSocket可以实现消息的实时发送和接收。
    ‌实时游戏‌:游戏数据的实时同步,提高游戏的交互性和体验。
    ‌数据推送‌:服务器端可以主动向客户端推送数据,如股票行情、天气预报、新闻资讯等。
    ‌实时监控‌:如视频监控、设备状态监控等,WebSocket可以实时传输监控数据。
    ‌协同编辑‌:如在线文档编辑、协同设计等,通过WebSocket实现多人实时编辑和同步。

    WebSocket 在爬虫工作中的情况

    WebSocket在WEB端比较少见,在短视频平台比较常见,想某音及其旗下的一些产品有使用这种通讯协议,WEB端表现如下:

    有些站点还会使用二进制进行消息通信,比较有挑战性的如巨量百应,大家感兴趣可以去研究研究。

    Python 中 WebSocket 的使用案例

    下面是一个使用 websockets 库实现 WebSocket 服务器和客户端

    安装websockets库

    pip install websockets

    WebSocket 服务器示例

    # server.py
    import asyncio
    
    import websockets
    
    
    async def echo(websocket, path):
        async for message in websocket:
            print(f"Received message: {message}")
            await websocket.send(f"Echo: {message}")
    
    
    start_server = websockets.serve(echo, "localhost", 8765)
    
    asyncio.get_event_loop().run_until_complete(start_server)
    asyncio.get_event_loop().run_forever()
    
    

    WebSocket 客户端示例

    # client.py
    import asyncio
    
    import websockets
    
    
    async def hello():
        uri = "ws://localhost:8765"
        async with websockets.connect(uri) as websocket:
            await websocket.send("Hello, WebSocket!")
            response = await websocket.recv()
            print(f"Received response: {response}")
    
    
    asyncio.get_event_loop().run_until_complete(hello())
    
    

    运行结果

    作者:九月镇灵将

    物联沃分享整理
    物联沃-IOTWORD物联网 » 什么是WebSocket?在Python中如何应用?

    发表回复