這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
先看一下標準庫中http server的實現type tcpKeepAliveListener struct { *net.TCPListener}func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) { tc, err := ln.AcceptTCP() if err != nil { return } tc.SetKeepAlive(true) tc.SetKeepAlivePeriod(3 * time.Minute) return tc, nil}這裡可以看出:tc.SetKeepAlivePeriod(3 * time.Minute) 設定了逾時時間為3分鐘,這個先到這裡下面會用到
func main() { http.HandleFunc("/", route) http.ListenAndServe(":1789", nil)}func route(w http.ResponseWriter, r *http.Request) { log.Printf("Addr->%s\tURI->%s\n", r.RemoteAddr, r.URL.Path) defer r.Body.Close() switch r.URL.Path { case "/": w.Write([]byte("welcome to work-stacks")) case "/gettcp": gettcp(w, r) default: http.NotFound(w, r) }}func gettcp(w http.ResponseWriter, r *http.Request) { //這裡返回的*bufio.ReadWriter 沒有處理, 生產環境注意要情況bufferd conn, _, err := w.(http.Hijacker).Hijack() if err != nil { log.Printf("擷取Hijacks失敗:%s\n", err.Error()) return } if tcp,ok := conn.(*net.TCPConn);ok { tcp.SetKeepAlivePeriod(60 * time.Minute) } //然後就可以做自己要做的操作了. conn.Close()}
func main() { req, err := http.NewRequest("GET", "http://127.0.0.1:1789/gettcp", nil) if err != nil { log.Println("建立請求失敗:%s\n", err.Error()) return } conn, _ := net.Dial("tcp", "127.0.0.1:1789") defer conn.Close() hclient := httputil.NewClientConn(conn, nil) err = hclient.Write(req) if err != nil { log.Printf("發送請求失敗:%s\n", err) return }}