什么时候去http.Get重用tcp连接?

时间:2017-12-01 05:26:40

标签: sockets http go tcp

GO net / http Response Body注释中的

说:

  

呼叫者有责任关闭Body。默认HTTP客户端的传输不会尝试重用HTTP / 1.0或HTTP / 1.1 TCP连接(“keep-alive”),除非正在读取Body以完成并且   闭合。

这是意思:如果我使用http.Get并且不调用resp.Body.Close()那么它将不会重新生成HTTP / 1.0或HTTP / 1.1 TCP连接(“keep-alive”)是吗?

所以我写了一些代码:      

package main

import ( "time" "fmt" "io/ioutil" "net/http" )

func main() { 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)

}

我只看到wireshark中的一个tcp连接,为什么? 我没有关闭res.Body所以http客户端不应该重用tcp连接。

2 个答案:

答案 0 :(得分:1)

这个问题已经解决了 https://github.com/golang/go/issues/22954

答案 1 :(得分:0)

你已经读过它直到第一次出现在行的结尾:

_, err = ioutil.ReadAll(resp.Body)

因此可以重新连接。尽量不要阅读并再次运行。