14.11 你是否主动关闭过http连接,为啥要这样做 - Go语言中文社区

14.11 你是否主动关闭过http连接,为啥要这样做


有关闭,不关闭会程序可能会消耗完 socket 描述符。有如下2种关闭方式:

  • 直接设置请求变量的 Close 字段值为 true,每次请求结束后就会主动关闭连接。
  • 设置 Header 请求头部选项 Connection: close,然后服务器返回的响应头部也会有这个选项,此时 HTTP 标准库会主动断开连接
  1. // 主动关闭连接
  2. func main() {
  3. req, err := http.NewRequest("GET", "http://golang.org", nil)
  4. checkError(err)
  5. req.Close = true
  6. //req.Header.Add("Connection", "close") // 等效的关闭方式
  7. resp, err := http.DefaultClient.Do(req)
  8. if resp != nil {
  9. defer resp.Body.Close()
  10. }
  11. checkError(err)
  12. body, err := ioutil.ReadAll(resp.Body)
  13. checkError(err)
  14. fmt.Println(string(body))
  15. }

你可以创建一个自定义配置的 HTTP transport 客户端,用来取消 HTTP 全局的复用连接。

  1. func main() {
  2. tr := http.Transport{DisableKeepAlives: true}
  3. client := http.Client{Transport: &tr}
  4. resp, err := client.Get("https://golang.google.cn/")
  5. if resp != nil {
  6. defer resp.Body.Close()
  7. }
  8. checkError(err)
  9. fmt.Println(resp.StatusCode) // 200
  10. body, err := ioutil.ReadAll(resp.Body)
  11. checkError(err)
  12. fmt.Println(len(string(body)))
  13. }
版权声明:本教程内容除了本站原创内容外,还有来源自C语言编程网,博客园,CSDN等技术站点,感谢相关博主原创文章,转载请附上原文出处链接和本声明。
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 阅读 ( 612 )
  • 分类:Go

0 条评论

官方社群

GO教程

猜你喜欢