【问题标题】:golang parsing chunked HTTP responses from socket - read chunk by chunkgolang解析来自套接字的分块HTTP响应 - 逐块读取
【发布时间】:2019-12-04 07:29:31
【问题描述】:

我的邮件目标是从连接到 HTTP 服务器的 TCP 套接字读取数据,并解析 逐块的 HTTP 响应(Transfer-Encoding: chunked) - 服务器每 30 秒在同一连接上发送一个块

我附上了我的代码。好像 io.Copy 读取了第一个块,然后在返回之前等待下一个块,所以它阻止了我。

如何在块到达时读取它们,而无需等待下一个?

func readHttpChunk(server net.conn) {
    buf := bufio.NewReader(server)
    for {
        resp, err := http.ReadResponse(buf, nil)
        b := new(bytes.Buffer)
        io.Copy(b, resp.Body)
        fmt.Printf("Got me a chunk!")
    }
}

【问题讨论】:

  • 您实际上是在尝试使用固有的无状态协议在较长时间内流式传输数据。使用这种方法你会遇到各种各样的问题。相反,对任意数据使用websockets,或对正式消息使用grpc
  • 感谢您的评论。是的,我知道这是对 HTTP 协议的滥用。我仍在努力解决这个问题:)
  • 已经解决了。看上面。一遍又一遍地重新发明轮子对进一步发展 FOSS 并没有什么帮助,对于封闭源代码/商业应用程序来说,这只是浪费了宝贵的、昂贵开发人员时间。尤其是在更远的地方,因为你也必须维护这些东西。

标签: http go


【解决方案1】:

不要使用io.Copy,而是使用resp.Body.Read(buf),其中buf 是分配的字节片。使用足够大的缓冲区,这样块就不会被截断。读取应该用一个块填充buf

【讨论】:

    猜你喜欢
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2016-01-21
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多