在Golang中重复使用Keep-Alive连接

时间:2017-10-09 11:17:56

标签: go tcp keep-alive

type ExampleStruct struct {
    Added   []string `json:"add"`
}

在Golang中,只要请求在Keep-Alive连接中超时,连接就会丢失并且重置。对于上面的代码,超时看到Wireshark中的数据包显示RST是由客户端发送的,因此连接不再被重用。

事件尝试使用Houtpclient的Timeout而不是ContextWithTimeout,但在连接重置时有类似的发现。

无论如何,即使遇到请求超时,我们也可以保留已建立的保持连接状态。

1 个答案:

答案 0 :(得分:0)

net/http 客户端在超时时关闭连接,因为连接不能被重用。

考虑如果连接被重用会发生什么。如果客户端在超时前未收到服务器的任何响应或部分响应,则下一个请求将读取一些先前的响应。

要在超时时保持连接活动,请在应用程序代码中实现超时。继续在 net/http 客户端使用更长的超时时间来处理连接真正卡住或死掉的情况。

result := make(chan []byte)
go func() {
   defer close(result)
   resp, err := client.Do(request)
   if err != nil {
        // return
   }
   defer resp.Body.Close()
   if resp.StatusCode == http.StatusOK {
      p, err := ioutil.ReadAll(resp.Body)
      if err != nil {
         return
      }
      result <- resp
  }
}()

select {
case p, ok <- result:
   if ok {
      // p is the response body
   }
case time.After(timeout):
   // do nothing
}