type ExampleStruct struct {
Added []string `json:"add"`
}
在Golang中,只要请求在Keep-Alive连接中超时,连接就会丢失并且重置。对于上面的代码,超时看到Wireshark中的数据包显示RST是由客户端发送的,因此连接不再被重用。
事件尝试使用Houtpclient的Timeout而不是ContextWithTimeout,但在连接重置时有类似的发现。
无论如何,即使遇到请求超时,我们也可以保留已建立的保持连接状态。
答案 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
}