ホームページ  >  記事  >  バックエンド開発  >  Python を使用した WebSocket について理解する

Python を使用した WebSocket について理解する

WBOY
WBOYオリジナル
2024-09-10 06:01:02919ブラウズ

Understanding WebSockets using Python

はじめに

今日のデジタル環境では、リアルタイムのコミュニケーションが重要です。従来の HTTP は、その要求応答モデルと固有の遅延により不十分です。ビジネスやアプリケーションでは、リアルタイムの株式更新、マルチプレイヤー ゲーム、共同作業ツールなど、即時データ転送の需要がますます高まる中、WebSocket が革新的なテクノロジとして登場しました。 HTTP とは異なり、WebSocket は全二重の双方向通信を可能にし、サーバーとクライアントの両方が単一の永続的な接続を介してリアルタイムでメッセージを送受信できるようにします。これにより、オーバーヘッドが削減されるだけでなく、Web アプリケーションのパフォーマンスと応答性も大幅に向上します。

WebSocket とは

WebSocket は、単一の存続期間の長い TCP 接続を介して全二重通信チャネルを提供する通信プロトコルです。これは、クライアントとサーバー間で WebSocket 接続が確立されると、接続を再度開くことなく、双方が同時に継続的にデータを送受信できることを意味します。 WebSocket は効率的かつ低遅延になるように設計されており、リアルタイム アプリケーションに最適です。

WebSocket を使用する理由?

WebSocket は、クライアントとサーバー間のリアルタイム通信が必要なシナリオで使用されます。クライアントがすべてのリクエストを開始する必要があるリクエスト/レスポンス モデルに従う従来の HTTP とは異なり、WebSocket では双方向通信が可能です。このため、WebSocket は、クライアントが要求することなく、サーバーからクライアントにリアルタイムでデータをプッシュする必要があるアプリケーションで特に役立ちます。

現実世界の使用例

  • チャット アプリケーション: WebSocket は、メッセージを遅延なくリアルタイムで送受信する必要があるチャット アプリケーションでよく使用されます。
  • ライブ ストリーミング: WebSocket を使用してライブ ビデオまたはオーディオをストリーミングでき、新しいコンテンツが利用可能になったときにサーバーがクライアントにプッシュできるようになります。
  • 共同作業プラットフォーム: Google ドキュメントなどの共同作業ツールでは、WebSocket を使用すると、複数のユーザーがページを更新することなく、他のユーザーが行った変更をリアルタイムで確認できます。

WebSocket と HTTP

コミュニケーションモデル

  • HTTP: クライアントがリクエストを開始し、サーバーが応答するリクエスト/レスポンス モデルに従います。応答後、接続は閉じられます。
  • WebSocket: WebSocket は、クライアントとサーバーの両方が毎回接続を再度開くことなく継続的にデータを送受信できる、全二重の長期接続を提供します。

接続処理

  • HTTP: 各リクエストは新しい接続を開き、応答後に接続は閉じます。
  • WebSocket: 最初のハンドシェイク (HTTP を使用) の後、接続は開いたままになり、接続を再確立することなくリアルタイム通信が可能になります。

効率

  • HTTP: リクエストが頻繁に発生しない 1 回限りの通信またはトランザクションに適しています。ステートレスであるため、継続的な通信にはロングポーリングなどの手法が使用されますが、これはリソースを大量に消費する可能性があります。
  • WebSocket: WebSocket は、接続が開いたままであるため、リアルタイムの双方向通信に効率的です。ロングポーリングなどの手法と比較して、使用するリソースが少なくなります。

レイテンシ

  • HTTP: クライアントが要求し、サーバーが応答する必要があるため、常に遅延 (レイテンシ) が発生します。これはリアルタイムの使用例では非効率的です。
  • WebSocket: 接続が確立されると、データはクライアントとサーバーの間でほぼ瞬時に流れるため、待ち時間が短縮され、リアルタイム アプリケーションに最適です。

ユースケース

  • HTTP: リクエストがクライアントによって開始される従来の Web アプリケーション (REST API など) に最適です。
  • WebSocket: チャット アプリ、株式取引プラットフォーム、ライブ ダッシュボード、オンライン ゲームなどのリアルタイム アプリケーションに最適です。

WebSocket の利点

  1. リアルタイム通信: WebSocket はリアルタイムの低遅延通信を可能にし、即時更新が必要なアプリケーションに最適です。
  2. 双方向データ フロー: サーバーがクライアントから開始されたリクエストにのみ応答できる HTTP とは異なり、クライアントとサーバーの両方がいつでもデータを送受信できます。
  3. オーバーヘッドの削減: WebSocket は接続を開いたままにすることで、新しい HTTP 接続を繰り返し確立する必要性を減らし、帯域幅を節約し、待ち時間を短縮します。
  4. 効率: WebSocket は、継続的なデータ転送のためのロングポーリングや HTTP リクエストと比較して、使用するリソースが少なくなります。
  5. スケーラビリティ: WebSocket は多くの同時接続を効率的に処理できるため、スケーラブルなリアルタイム アプリケーションに適しています。

WebSocket の仕組み

  1. ハンドシェイク: WebSocket 接続は HTTP ハンドシェイクから始まります。クライアントは、接続プロトコルを HTTP から WebSocket に切り替えるために、Upgrade ヘッダーを含むリクエストをサーバーに送信します。
  2. 接続の確立: ハンドシェイクの後、接続が確立されます。サーバーとクライアントは、永続的なオープンな TCP 接続を維持します。
  3. 全二重通信: WebSocket 接続が確立されると、データを同時に送受信できます。サーバーとクライアントの両方がいつでも通信を開始できます。
  4. 接続を閉じる: サーバーまたはクライアントは、必要がなくなったときに接続を閉じることができます。これによりセッションが終了し、リソースが解放されます。

WebSocket の使用例

  1. チャット アプリケーション: WhatsApp や Slack などのインスタント メッセージング サービスは、ユーザー間のリアルタイム メッセージングに WebSocket を使用します。
  2. ライブ更新: WebSocket は、金融取引プラットフォーム (株価)、スポーツのスコア、ライブ ニュース フィードなどのアプリケーションのリアルタイム データ更新を強化します。
  3. 共同作業ツール: WebSocket を使用すると、Google ドキュメントや Figma などの共同作業ツールでリアルタイムの更新が可能になり、複数のユーザーが同時にドキュメントを編集できます。
  4. オンライン ゲーム: マルチプレイヤー ゲームは、リアルタイムのプレイヤーのアクションと対話のために WebSocket に依存します。
  5. IoT とセンサー データ: リアルタイム データ ストリーミングを備えたデバイス (IoT デバイス、気象センサーなど) は、WebSocket を使用して継続的な更新を送信します。

Python と WebSocket を使用したリアルタイム アプリケーションの構築

Python (FastAPI を使用) と Streamlit で WebSocket を使用してリアルタイム アプリケーションを構築しましょう。

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。