首页 > 后端开发 > 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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板