Go http.Get 何时重用 tcp 连接?

loi*_*iao 5 sockets tcp http go

在 GO net/http Response Body 注释中说:

调用者有责任关闭 Body。默认 HTTP 客户端的 Transport 不会尝试重用 HTTP/1.0 或 HTTP/1.1 TCP 连接(“保持活动”),除非 Body 被读取完成并关闭。

这意味着:如果我使用 http.Get 并且不调用 resp.Body.Close() 那么它不会恢复 HTTP/1.0 或 HTTP/1.1 TCP 连接(“保持活动”)是吗?

所以我写了一些代码:

包主

进口 ( “时间” “FMMT” “io/ioutil” “网络/http” )

函数主() { resp, err := http.Get(" http://127.0.0.1:8588 ")

if err != nil {
    panic(err)
}
_, err = ioutil.ReadAll(resp.Body)
if err != nil {
    panic(err)
}

resp2, err := http.Get("http://127.0.0.1:8588")

if err != nil {
    panic(err)
}
_, err = ioutil.ReadAll(resp2.Body)
if err != nil {
    panic(err)
}

fmt.Println("before time sleep")
time.Sleep(time.Second * 35)
Run Code Online (Sandbox Code Playgroud)

}

我只看到在wireshark 中建立了一个tcp 连接,为什么?我不关闭res.Body,因此http客户端不应重用 tcp 连接。

Eug*_*sky 0

您已阅读到第一次出现以下行的结尾:

_, err = ioutil.ReadAll(resp.Body)
Run Code Online (Sandbox Code Playgroud)

因此连接已准备好重新使用。尽量不要再次读取和运行。