请教 Golang HTTP 的 Shutdown 函数

2019-04-30 00:04:32 +08:00
 jinliming2

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=utf-8

asdasdasdasdasdConnection closed by foreign host.
3904 次点击
所在节点    Go 编程语言
3 条回复
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.
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.
jinliming2
2019-04-30 21:51:48 +08:00
非常感谢,加一个 chan 等一下就好了,成功了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/559931

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX