ホームページ > バックエンド開発 > Golang > Go HTTP サーバーからデータをチャンクで連続して送信するにはどうすればよいですか?

Go HTTP サーバーからデータをチャンクで連続して送信するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-29 04:30:08
オリジナル
698 人が閲覧しました

How to Send Data Sequentially in Chunks from a Go HTTP Server?

チャンクを使用して Go サーバーからデータを順次送信する

Go で HTTP サーバーを作成する場合、応答を送信すると便利な場合がありますチャンクに分けて送信するため、データを取得しながら徐々に送信できます。これにより、クライアントは順次データを受信できるようになります。

ただし、クライアントが所定の期間の終わりにのみチャンクを受信して​​いる場合、または Go が Content-Length ヘッダーを自動的に設定している場合は、イライラする可能性があります。 。これを修正するには、Go のチャンク化された HTTP 応答の微妙な違いを詳しく調べる必要があります。

まず、Transfer-Encoding ヘッダーは Go の HTTP 応答ライターによって暗黙的に処理されることを覚えておくことが重要です。したがって、明示的に設定する必要はありません。

連続チャンク配信を実現する鍵は、Flusher.Flush() を使用することにあります。各チャンクが書き込まれた後にこのメソッドを呼び出すことで、「チャンク化」エンコーディングをトリガーし、データをクライアントに送信します。これにより、クライアントは準備ができたときに各チャンクを確実に受信できるようになります。

この手法を実装する方法の例を次に示します。

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

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        flusher, ok := w.(http.Flusher)
        if !ok {
            panic("expected http.ResponseWriter to be an http.Flusher")
        }
        w.Header().Set("X-Content-Type-Options", "nosniff")
        for i := 1; i <= 10; i++ {
            fmt.Fprintf(w, "Chunk #%d\n", i)
            flusher.Flush() // Trigger "chunked" encoding and send a chunk...
            time.Sleep(500 * time.Millisecond)
        }
    })

    log.Print("Listening on localhost:8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}
ログイン後にコピー

このアプローチを使用すると、Go HTTP サーバーが確実にチャンクを順番に送信し、クライアントがタイムリーにデータを受信できるようにします。さらに、http.ResponseWriters は複数のゴルーチンによる同時アクセスをサポートしていることを覚えておくことが重要です。これにより、必要に応じて、別のスレッドまたはゴルーチンからチャンクを送信できるようになります。

以上がGo HTTP サーバーからデータをチャンクで連続して送信するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート