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

请教 Golang HTTP 的 Shutdown 函数

  •  
  •   jinliming2 ·
    jinliming2 · 2019-04-30 00:04:32 +08:00 · 4073 次点击
    这是一个创建于 2012 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
    fcten
        1
    fcten  
       2019-04-30 10:24:08 +08:00   ❤️ 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.
    zzzzzzzzzp
        2
    zzzzzzzzzp  
       2019-04-30 10:45:04 +08:00   ❤️ 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.
    jinliming2
        3
    jinliming2  
    OP
       2019-04-30 21:51:48 +08:00
    非常感谢,加一个 chan 等一下就好了,成功了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1478 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:55 · PVG 07:55 · LAX 16:55 · JFK 19:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.