真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

golanghttp連接復(fù)用方法

server端

安溪ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

golang httpserver 默認(rèn)開啟keepalive連接復(fù)用選項(xiàng)

handler函數(shù)需要完整讀body數(shù)據(jù),構(gòu)造返回消息,否則當(dāng)數(shù)據(jù)不能一次發(fā)送完成時,連接復(fù)用就會失效。

示例如下

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 端

客戶端需要構(gòu)建全局client,完整讀 response body,并關(guān)閉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連接復(fù)用方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持創(chuàng)新互聯(lián)。


網(wǎng)站題目:golanghttp連接復(fù)用方法
網(wǎng)址分享:http://weahome.cn/article/jpgeci.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部