http的长连接

golang 的net/http库默认支持长连接。
通过ListenAndServe源码可以看到。

for {
        rw, e := l.Accept()
        ...
        go c.serve(ctx)
    }

每一个tcp连接,go都会对应一个协程对其服务,再server内,源码显示

    for {
        w, err := c.readRequest(ctx)
        if c.r.remain != c.server.initialReadLimitSize() {
            // If we read any bytes off the wire, we're active.
            c.setState(c.rwc, StateActive)
        }
        serverHandler{c.server}.ServeHTTP(w, w.req)
        ....
        c.rwc.SetReadDeadline(time.Time{})
    }

在这个函数内,我们会发现对于每一个tcp连接,go支持长连接,等待新的请求过来。

我们可以在服务端设定服务的超时时间,在ListenAndServe之前。

l4g.Info("ListenAndServer: %v end", serveraddr)
    srv := &http.Server{
        Addr:         serveraddr,
        Handler:      mux,
        IdleTimeout:  1 * time.Minute,
        ReadTimeout:  5 * time.Second,
        WriteTimeout: 10 * time.Second,
    }
    err = srv.ListenAndServe()

设定服务段对于客户端的连接超时时间的设定,注意,这个超时指的是tcp连接的超时