• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang http连接复用方法

    server端

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

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

    示例如下

    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

    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连接复用方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • golang复用http.request.body的方法示例
    • 浅谈golang的http cookie用法
    上一篇:Go使用defer函数要注意的几个点
    下一篇:Golang 使用http Client下载文件的实现方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    golang http连接复用方法 golang,http,连接,复用,方法,