使用 Python 了解 WebSocket

WBOY
发布: 2024-09-10 06:01:02
原创
1008 人浏览过

Understanding WebSockets using Python

简介

在当今的数字环境中,实时通信非常重要。传统的 HTTP 由于其请求-响应模型和固有的延迟而存在不足。随着业务和应用程序越来越需要即时数据传输(无论是实时股票更新、多人游戏还是协作工具),WebSocket 已成为一项改变游戏规则的技术。与 HTTP 不同,WebSocket 支持全双工、双向通信,允许服务器和客户端通过单个持久连接实时发送和接收消息。这不仅减少了开销,还显着提高了 Web 应用程序的性能和响应能力。

什么是 WebSocket

WebSocket 是一种通信协议,可通过单个长期 TCP 连接提供全双工通信通道。这意味着一旦客户端和服务器之间建立了 WebSocket 连接,双方就可以同时连续地发送和接收数据,而无需重新打开连接。 WebSocket 被设计为高效且低延迟,使其成为实时应用程序的理想选择。

为什么使用 WebSocket ?

WebSockets 用于客户端和服务器之间需要实时通信的场景。与遵循请求-响应模型(客户端必须发起每个请求)的传统 HTTP 不同,WebSocket 允许双向通信。这使得 WebSocket 在需要将数据从服务器实时推送到客户端而无需客户端请求的应用程序中特别有用。

现实世界用例

  • 聊天应用程序:WebSockets 常用于需要实时无延迟发送和接收消息的聊天应用程序。
  • 实时流媒体:WebSocket 可用于流式传输实时视频或音频,允许服务器在新内容可用时将其推送到客户端。
  • 协作平台:在 Google Docs 等协作工具中,WebSocket 允许多个用户查看其他人所做的实时更改,而无需刷新页面。

WebSocket 与 HTTP

沟通模型

  • HTTP:遵循请求-响应模型,客户端发起请求,服务器响应。响应后,连接关闭。
  • WebSockets:WebSockets 提供全双工、长期存在的连接,客户端和服务器都可以连续发送和接收数据,而无需每次重新打开连接。

连接处理

  • HTTP:每个请求都会打开一个新连接,响应完成后关闭连接。
  • WebSockets:初次握手(使用 HTTP)后,连接保持打开状态,允许实时通信,无需重新建立连接。

效率

  • HTTP:适合一次性通信或请求不频繁的事务。它是无状态的,因此为了持续通信,需要使用长轮询等技术,这可能会占用大量资源。
  • WebSockets:WebSockets 对于实时和双向通信非常有效,因为连接保持打开状态。与长轮询等技术相比,它们使用的资源更少。

延迟

  • HTTP:总是存在延迟(延迟),因为客户端必须请求,服务器必须响应。这对于实时用例来说效率很低。
  • WebSockets:建立连接后,数据几乎可以立即在客户端和服务器之间流动,减少延迟,使其成为实时应用程序的理想选择。

用例

  • HTTP:最适合由客户端发起请求的传统 Web 应用程序(例如 REST API)。
  • WebSockets:非常适合实时应用程序,如聊天应用程序、股票交易平台、实时仪表板和在线游戏。

WebSocket 的优点

  1. 实时通信:WebSocket 允许实时、低延迟通信,使其成为需要即时更新的应用程序的理想选择。
  2. 双向数据流:客户端和服务器都可以随时发送和接收数据,不像HTTP,服务器只能响应客户端发起的请求。
  3. 减少开销:通过保持连接打开,WebSocket 减少了重复建立新 HTTP 连接的需要,从而节省了带宽并减少了延迟。
  4. 效率:与长轮询或连续数据传输的 HTTP 请求相比,WebSocket 使用更少的资源。
  5. 可扩展性:WebSockets 可以有效地处理许多并发连接,使其适合可扩展的实时应用程序。

WebSocket 的工作原理

  1. 握手:WebSocket 连接以 HTTP 握手开始。客户端向服务器发送带有 Upgrade 标头的请求,将连接协议从 HTTP 切换为 WebSocket。
  2. 连接建立:握手后,连接建立。服务器和客户端保持持久的、开放的 TCP 连接。
  3. 全双工通信:一旦 WebSocket 连接打开,数据就可以同时来回发送。服务器和客户端都可以随时发起通信。
  4. 关闭连接:当不再需要连接时,服务器或客户端都可以关闭连接。这将终止会话并释放资源。

WebSocket 用例

  1. 聊天应用程序:WhatsApp 和 Slack 等即时消息服务使用 WebSockets 在用户之间进行实时消息传递。
  2. 实时更新:WebSockets 为金融交易平台(股票价格)、体育比分或实时新闻提要等应用程序提供实时数据更新。
  3. 协作工具:WebSocket 可以在 Google Docs 或 Figma 等协作工具中实现实时更新,多个用户可以同时编辑文档。
  4. 在线游戏:多人游戏依靠 WebSocket 进行实时玩家操作和交互。
  5. 物联网和传感器数据:具有实时数据流的设备(例如物联网设备、天气传感器)使用 WebSocket 发送连续更新。

使用 Python 和 WebSocket 构建实时应用程序

让我们使用 WebSockets 与 Python(使用 FastAPI)和 Streamlit 构建一个实时应用程序。

1。设置 FastAPI WebSocket 服务器

此代码使用 FastAPI 设置 WebSocket 服务器。

from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from typing import List

app = FastAPI()

class ConnectionManager:
    def __init__(self):
        self.active_connections: List[WebSocket] = []

    async def connect(self, websocket: WebSocket):
        await websocket.accept()
        self.active_connections.append(websocket)

    def disconnect(self, websocket: WebSocket):
        self.active_connections.remove(websocket)

    async def broadcast(self, message: str):
        for connection in self.active_connections:
            await connection.send_text(message)

manager = ConnectionManager()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await manager.connect(websocket)
    try:
        while True:
            data = await websocket.receive_text()
            await manager.broadcast(f"Message: {data}")
    except WebSocketDisconnect:
        manager.disconnect(websocket)
登录后复制

此 WebSocket 服务器可以处理多个连接并向所有连接的客户端广播消息。

2。 Streamlit 前端

现在,让我们使用 Streamlit 构建一个实时应用程序,连接到 WebSocket 服务器并接收实时更新。

import streamlit as st
import asyncio
import websockets

async def websocket_receive():
    uri = "ws://localhost:8000/ws"
    async with websockets.connect(uri) as websocket:
        while True:
            message = await websocket.recv()
            st.write(f"Received: {message}")

st.title("Real-Time WebSocket Client")

if st.button("Connect to WebSocket"):
    st.write("Connected!")
    asyncio.run(websocket_receive())
登录后复制

说明:当用户单击“连接到 WebSocket”按钮时,Streamlit 前端会与 WebSocket 服务器建立连接并侦听消息。

3。运行应用程序

运行 FastAPI 服务器:

uvicorn server:app --reload
登录后复制

运行 Streamlit 应用程序:

streamlit run your_script.py
登录后复制

实时沟通的关键步骤:

  • WebSocket 设置:WebSocket 服务器运行并接受连接。
  • Streamlit 连接:Streamlit 前端发起与 WebSocket 服务器的连接。
  • 全双工通信:客户端(Streamlit)和服务器(FastAPI)都可以实时发送/接收消息。

以上是使用 Python 了解 WebSocket的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!