golang http连接复用方法

时间:2022-06-24 03:54:30

server端

golang httpserver 默认开启keepalive连接复用选项

handler函数需要完整读body数据,构造返回消息,否则当数据不能一次发送完成时,连接复用就会失效。

示例如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package main
 
import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "os"
    "strconv"
    "strings"
    "time"
)
 
func connHandler(w http.ResponseWriter, r *http.Request) {
    // parse
    r.ParseForm()
    response_time := r.Header.Get("sleep-time")
    // <= NOTE
    if _, err := ioutil.ReadAll(r.Body); err != nil {
        http.Error(w, err.Error(), 500)
        return
    }
    defer r.Body.Close()
    // sleep for some time
    resp_time := 1
    if response_time != "" {
        ms, _ := strconv.ParseFloat(response_time, 64)
        resp_time = (int)(ms * 1000)
    }
    time.Sleep(time.Duration(resp_time) * time.Millisecond)
    // parepare response
    status := 200
    body := ""
    w.Header().Set("Content-Type", "text/plain")
    w.Header().Set("Content-Length", strconv.Itoa(len(body)))
    w.WriteHeader(status)
    w.Write([]byte(body))
}
 
func main() {
    http.HandleFunc("/", connHandler)
    if err := http.ListenAndServe(":server_port", nil); err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

client 端

客户端需要构建全局client,完整读 response body,并关闭body

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package main
 
import (
  "bytes"
  "fmt"
  "io"
  "io/ioutil"
  "log"
  "net/http"
  "time"
)
 
var (
  httpClient *http.Client
)
 
const (
  MaxIdleConnections int = 20
  RequestTimeout   int = 30
)
 
// init HTTPClient
func init() {
  httpClient = createHTTPClient()
}
 
// createHTTPClient for connection re-use
func createHTTPClient() *http.Client {
  client := &http.Client{
   Transport: &http.Transport{
      MaxIdle  ConnsPerHost: MaxIdleConnections,
 },
 Timeout: time.Duration(RequestTimeout) * time.Second,
  }
  return client
}
 
func conn_reuse_post(conn_reuse_times int) {
  var endPoint string = "http://server_ip:server_port/"
  data := []byte{}
  // fill data
  for i := 0; i < conn_reuse_times; i++ {
 // use global httpClient to send request
 resp, err := httpClient.Post(endPoint, "application/x-www-form-urlencoded", bytes.NewBuffer([]byte(data)))
 fmt.Println(resp)
 if err != nil {
   log.Println("err", err)
   return
 }
 io.Copy(ioutil.Discard, resp.Body) // <= NOTE
 resp.Body.Close()  // <= NOTE
  }
}
 
func main() {
  conn_reuse_post(5)
}

以上这篇golang http连接复用方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/liliang199/article/details/79340912