使用 Python 了解 WebSocket

WBOY
發布: 2024-09-10 06:01:02
原創
1007 人瀏覽過

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學習者快速成長!