最近一個 golang 寫的 http.client 的,獲取遠程服務器數據,有時候會報錯,尤其在數量很大的時候,老是收到 Connection reset by peer 這樣的 提醒,都有點想用重試機制
百度,goolge 了一翻后,說的是 它會阻止連接被重用,可以有效的防止這個問題,也就是Http的短連接
1.在客戶端關閉 http 連接
func main() { req, err := http.NewRequest("GET", "http://localhost",nil ) if err != nil { log.Errorf("") } req.Close = true resp, err := http.Client.Do(req) ... }
- 在頭部設置連接狀態為關閉
func main() { req, err := http.NewRequest("GET", "http://localhost",nil ) if err != nil { log.Errorf("") } req.Header.Add("Connection", "close") resp, err := http.Client.Do(req) ... }
- 使用
Transport
取消 HTTP利用連接func main() { tr := http.Transport{DisableKeepAlives: true} client := http.Client{Transport: &tr} resp, err := client.Get("https://golang.google.cn/") if resp != nil { defer resp.Body.Close() } checkError(err) fmt.Println(resp.StatusCode) // 200 body, err := ioutil.ReadAll(resp.Body) checkError(err) fmt.Println(len(string(body))) }
服務器端設置短連接
-
func main(){ server := &http.Server{ Handler:handle, ReadTimeout: 20 * time.Second, WriteTimeout: 20 * time.Second, } listen, err := net.Listen("tcp4",s.addr) if err != nil { logger.Errorf("Failed to listen,err:%s",err.Error()) panic(err) } server.SetKeepAlivesEnabled(false) err = server.Serve(listen) }
參考 了
- 使用
-
https://blog.csdn.net/cyberspecter/article/details/83308348
- https://my.oschina.net/shou1156226/blog/808613