首頁 > 後端開發 > Golang > 如何在 Go 中發送帶有無緩衝 HTTP 回應的即時資料?

如何在 Go 中發送帶有無緩衝 HTTP 回應的即時資料?

Susan Sarandon
發布: 2024-12-17 21:06:15
原創
211 人瀏覽過

How Can I Send Real-Time Data with Unbuffered HTTP Responses in Go?

在Go 中使用未緩衝的HTTP 回應傳送即時資料

在Go 中,HTTP 回應通常在傳送到客戶端之前進行緩衝。然而,對於串流或即時應用程序,在不緩衝的情況下增量發送資料至關重要。

要實現無緩衝響應,您可以利用某些 ResponseWriter 實作的 Flusher 介面。透過在每次寫入作業後刷新回應,您可以在資料可用時將資料直接傳送到用戶端。這是一個範例:

func handle(res http.ResponseWriter, req *http.Request) {
  fmt.Fprintf(res, "sending first line of data")
  if f, ok := res.(http.Flusher); ok {
    f.Flush()
  }
  sleep(10) // Not real code
  fmt.Fprintf(res, "sending second line of data")
}
登入後複製

雖然此方法適用於手動寫入,但它可能不足以滿足管道命令輸出或資料非同步傳入的其他場景。在這種情況下,您可以利用 Go 例程連續讀取和刷新資料。

pipeReader, pipeWriter := io.Pipe()
cmd.Stdout = pipeWriter
cmd.Stderr = pipeWriter
go writeCmdOutput(res, pipeReader)
err := cmd.Run()
pipeWriter.Close()

func writeCmdOutput(res http.ResponseWriter, pipeReader *io.PipeReader) {
  buffer := make([]byte, BUF_LEN)
  for {
    n, err := pipeReader.Read(buffer)
    if err != nil {
      pipeReader.Close()
      break
    }

    data := buffer[0:n]
    res.Write(data)
    if f, ok := res.(http.Flusher); ok {
      f.Flush()
    }
    // Reset buffer
    for i := 0; i < n; i++ {
      buffer[i] = 0
    }
  }
}
登入後複製

這種方法可確保命令輸出直接寫入並刷新到客戶端,而無需緩衝。為了進一步方便,請考慮使用像 [fasthttp](https://github.com/valyala/fasthttp) 這樣的函式庫,它為即時串流提供內建支援。

以上是如何在 Go 中發送帶有無緩衝 HTTP 回應的即時資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板