チャンクを使用して 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 サイトの他の関連記事を参照してください。