在 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中文网其他相关文章!