2016-06-22 109 views
1

我在golang中創建了一個文件服務器,並在Listener上調用Close()方法。Golang在關閉後保持文件服務套接字打開

當我嘗試在新的Web連接上訪問端口時,它顯示Socket已關閉,我無法訪問該網站。

如果我使用已經建立的連接刷新頁面....頁面重新加載好,就好像套接字從未關閉一樣?我甚至能夠瀏覽文件系統。

我注意到30分鐘後插座似乎強制關閉。

有什麼我失蹤,迫使套接字放棄所有現有的連接,以防止人們訪問文件服務器?

var fileListener net.Listener 
host_string = "127.0.0.1:8080" 
fileListener, _ = net.Listen("tcp", host_string) 
server := &http.Server{Addr: host_string, Handler:  
http.FileServer(http.Dir("/"))} 
go func() { server.Serve(fileListener) }() 
fileListener.Close() 

回答

2

沒有辦法關閉空閒的HTTP/1.1或HTTP2連接。 https://golang.org/issue/9478有一個未解決的問題,但沒有立即計劃。請注意,一旦關閉了偵聽器,您的服務器將不會接受新的連接;你正在重複使用相同的連接。

如果要強制關閉所有連接,則需要使用http.ServerConnState來自行執行簿記,以跟蹤處於活動狀態的TCP連接。

您也可以讓您的處理程序在每個響應中設置Connection: close,但如果客戶需要提出多個請求,那麼這會使得您的http服務器效率低下。

+0

會用TimeoutHandler幫忙包裝處理程序嗎? (https://golang.org/pkg/net/http/#TimeoutHandler) –

+0

我遵循了使用ConnState的建議。完美的作品!謝謝! –

相關問題