主頁 > 知識庫 > golang http連接復(fù)用方法

golang http連接復(fù)用方法

熱門標(biāo)簽:浙江高速公路地圖標(biāo)注 江西轉(zhuǎn)化率高的羿智云外呼系統(tǒng) 中國地圖標(biāo)注省會高清 南通如皋申請開通400電話 廣州呼叫中心外呼系統(tǒng) 地圖標(biāo)注的汽車標(biāo) 西部云谷一期地圖標(biāo)注 學(xué)海導(dǎo)航地圖標(biāo)注 高德地圖標(biāo)注口訣

server端

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

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)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • golang復(fù)用http.request.body的方法示例
  • 淺談golang的http cookie用法

標(biāo)簽:曲靖 常州 貴州 許昌 東營 德宏 保定 吐魯番

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang http連接復(fù)用方法》,本文關(guān)鍵詞  golang,http,連接,復(fù)用,方法,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang http連接復(fù)用方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang http連接復(fù)用方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章