ホームページ >バックエンド開発 >Python チュートリアル >Python と Go を使用したサーバー送信イベント (SSE) の実装

Python と Go を使用したサーバー送信イベント (SSE) の実装

Susan Sarandon
Susan Sarandonオリジナル
2024-12-22 08:35:10271ブラウズ

今日のインタラクティブな Web アプリケーションでは、ユーザー エクスペリエンスを向上させるためにリアルタイムのデータ更新が重要です。さまざまなリアルタイム通信テクノロジーの中でも、Server-Sent Events (SSE) は、シンプルかつ効果的なソリューションとして際立っています。 SSE を使用すると、サーバーは HTTP 経由でリアルタイムの更新をクライアントにプッシュできます。

Implementing Server-Sent Events (SSE) with Python and Go

SSEとは何ですか?

Server-Sent Events (SSE) は、サーバーがクライアントにプロアクティブにデータをプッシュできるようにするために使用されるテクノロジーであり、「イベント ストリーム」とも呼ばれます。これは HTTP プロトコルに基づいており、その長期間の接続特性を利用しています。 SSE はクライアントとサーバーの間に永続的な接続を確立し、サーバーがリアルタイムのデータ更新をクライアントに送信できるようにします。ただし、クライアントは SSE を通じてサーバーにデータを送り返すことはできません。

SSEを選ぶ理由

サーバー送信イベントは HTML5 仕様の一部であり、特にサーバーからクライアントにイベントをプッシュするために設計されています。そのシンプルさ、自動再接続、およびイベント追跡機能により、一方向のデータ フローが必要なシナリオに最適です。 SSE は、データが一方向にストリーミングされる場合に非常に優れたパフォーマンスを発揮します。

概要

SSE を使用すると、サーバーはリアルタイムでメッセージをブラウザにプッシュできます。 HTML5 仕様の一部として、以下が含まれます:

  • 通信プロトコル: HTTP を使用します。
  • イベント オブジェクト: ブラウザ側で使用できます。

WebSocket もリアルタイム通信を提供しますが、大きく異なります。

Feature SSE WebSockets
Protocol Basis HTTP TCP
Data Flow Unidirectional (server to client) Full-duplex (bidirectional)
Complexity Lightweight and simple More complex
Reconnection Built-in Manual implementation needed
Message Tracking Automatic Manual implementation needed
Data Types Text or Base64-encoded binary Various data types supported
Event Types Support Custom events supported Custom events not supported
Limitations HTTP/1.1 or HTTP/2 Unlimited connections

サーバーの実装

プロトコルの実装

基本的に、ブラウザは HTTP リクエストを開始し、サーバーは次のヘッダーとともに HTTP ステータスで応答します。

Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive

SSE では、イベント ストリームの MIME タイプが text/event-stream である必要があると指定されています。ブラウザはデータをキャッシュすべきではなく、接続は永続的 (キープアライブ) のままである必要があります。

メッセージフォーマット

イベント ストリームは、gzip で圧縮された UTF-8 エンコードされたテキストまたは Base64 エンコードされたバイナリ メッセージを使用します。各メッセージは、フィールド名 : フィールド値の形式の 1 つ以上のフィールドで構成されます。各フィールドは n で終わります。コロンで始まる行はコメントであり、ブラウザでは無視されます。プッシュ内の複数のメッセージは空行 (nn) で区切られます。

主要なフィールドは次のとおりです。

  • event: イベントのタイプ。
  • id: ブラウザが再接続のために最後に受信したイベントを追跡するために使用するイベント ID。
  • retry: ブラウザが失敗後に接続を再試行するまでの待ち時間 (ミリ秒)。
  • data: メッセージデータ。

例: Python を使用した SSE

Python を使用した実装は次のとおりです。

from flask import Flask, Response

app = Flask(__name__)

@app.route('/events')
def sse_handler():
    def generate():
        paragraph = [
            "Hello, this is an example of a continuous text output.",
            "It contains multiple sentences, each of which will be sent to the client as an event.",
            "This is to simulate the functionality of Server-Sent Events (SSE).",
            "We can use this method to push real-time updates.",
            "End of sample text, thank you!",
        ]

        for sentence in paragraph:
            yield f"data: {sentence}\n\n"

            import time
            time.sleep(1)

    return Response(generate(), mimetype='text/event-stream')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8081, debug=True)

例: Go を使用した SSE

Go を使用した実装は次のとおりです。

package main

import (
    "fmt"
    "log"
    "net/http"
    "time"
)

func main() {
    http.HandleFunc("/events", sseHandler)

    fmt.Println("Starting server on :8080")
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatalf("Server error: %v", err)
    }
}

func sseHandler(w http.ResponseWriter, r *http.Request) {
    flusher, ok := w.(http.Flusher)
    if !ok {
        http.Error(w, "Streaming unsupported!", http.StatusInternalServerError)
        return
    }

    w.Header().Set("Content-Type", "text/event-stream")
    w.Header().Set("Cache-Control", "no-cache")
    w.Header().Set("Connection", "keep-alive")

    paragraph := []string{
        "Hello, this is an example of a continuous text output.",
        "It contains multiple sentences, each of which will be sent to the client as an event.",
        "This is to simulate the functionality of Server-Sent Events (SSE).",
        "We can use this method to push real-time updates.",
        "End of sample text, thank you!",
    }

    for _, sentence := range paragraph {
        _, err := fmt.Fprintf(w, "data: %s\n\n", sentence)
        if err != nil {
            return
        }
        flusher.Flush()
        time.Sleep(1 * time.Second)
    }
}

ブラウザAPI

クライアント側では、JavaScript の EventSource API を使用して、サーバーから送信されたイベントをリッスンする EventSource オブジェクトを作成できます。接続すると、サーバーはブラウザにイベント メッセージを送信できます。ブラウザーは、onmessage、onopen、および onerror イベントをリッスンすることによって、これらのメッセージを処理します。

<!DOCTYPE html>
<html lang="ja">

    <メタ文字セット="UTF-8">
    <meta name="viewport" content="width=device-width、initial-scale=1.0">
    <title>SSE の例 ?</title>
</head>

    <h1>サーバー送信イベントの例 ?</h1>
    <div>



<h2>
  
  
  SSE デバッグ ツール
</h2>

<p>現在、Postman、Insomnia、Bruno、ThunderClient などの多くの人気ツールには、Server-Sent Events (SSE) のデバッグに対する適切なサポートが不足しています。この制限は、開発中に非常にイライラする可能性があります。幸いなことに、EchoAPI は優れた SSE デバッグ機能を提供し、ワークフローの効率と生産性を大幅に向上させます。</p>

<p><img src="https://img.php.cn/upload/article/000/000/000/173482771419125.jpg" alt="Implementing Server-Sent Events (SSE) with Python and Go"></p>

<p>SSE または API のデバッグを使用している場合は、EchoAPI を試してみることを強くお勧めします。デバッグ エクスペリエンスに革命をもたらし、開発プロセスを合理化できます。詳細については、echoapi.com をご覧ください。 </p>
<h3>
  
  
  例: SSE 用 EchoAPI クライアント
</h3>

<p>EchoAPI では、SSE インターフェイスの使用は簡単です。 URL を入力し、関連するパラメーターを入力して、[<strong>送信</strong>] をクリックするだけで、リクエストの結果が表示されます。</p>

<p><img src="https://img.php.cn/upload/article/000/000/000/173482771591634.jpg" alt="Implementing Server-Sent Events (SSE) with Python and Go"></p>


          </div>

            
        

以上がPython と Go を使用したサーバー送信イベント (SSE) の実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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