首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
beego
V2EX  ›  Go

请教 Golang HTTP 的 Shutdown 函数

  •  
  •   jinliming2 · 172 天前 · 1287 次点击
    这是一个创建于 172 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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.
    
    3 回复  |  直到 2019-04-30 21:51:48 +08:00
        1
    fcten   171 天前   ♥ 1
    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   171 天前   ♥ 1
    // 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   171 天前
    非常感谢,加一个 chan 等一下就好了,成功了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   883 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 27ms · UTC 21:30 · PVG 05:30 · LAX 14:30 · JFK 17:30
    ♥ Do have faith in what you're doing.