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连接的超时