
server.Shutdown 也会直接中断正在发数据的连接吗?
不 Shutdown 的话正常应该发送 60 个 asd,我在第 5 个调用了 Shutdown,连接直接被中断了。
请问一下大家这个是怎么回事?
var server *http.Server server = &http.Server{ IdleTimeout: 60*time.Second, WriteTimeout: 60*time.Second, Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Length", "181") w.WriteHeader(200) for i := 0; i < 60; i++ { if i == 5 { //server.SetKeepAlivesEnabled(false) _, _ = w.Write([]byte("zxc")) fmt.Println(server.Shutdown(context.Background())) _, _ = w.Write([]byte("qwe")) } _, _ = w.Write([]byte("asd")) if flusher, ok := w.( http.Flusher); ok { flusher.Flush() } else { fmt.Println("Not flushable") } //time.Sleep(time.Second) } _, _ = w.Write([]byte("\n")) }), } err = server.Serve(ServeHTTP) fmt.Println(err) $ telnet 127.0.0.1 80 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. GET / HTTP/1.1 Host: 127.0.0.1 HTTP/1.1 200 OK Content-Length: 181 Date: Mon, 29 Apr 2019 15:14:18 GMT Content-Type: text/plain; charset= asdasdasdasdasdConnection closed by foreign host. 1 fcten 2019-04-30 10:24:08 +08:00 https://golang.org/pkg/net/http/#Server.Shutdown When Shutdown is called, Serve, ListenAndServe, and ListenAndServeTLS immediately return ErrServerClosed. Make sure the program doesn't exit and waits instead for Shutdown to return. |
2 zzzzzzzzzp 2019-04-30 10:45:04 +08:00 // Shutdown works by first closing all open // listeners, then closing all idle connections, and then waiting // indefinitely for connections to return to idle and then shut down. 补充楼上,waiting indefinitely. |
3 jinliming2 OP 非常感谢,加一个 chan 等一下就好了,成功了 |