2017-06-16 103 views
0

當我看在網/ HTTP服務器的接口,我看不出有得到通知的明顯的方式和反應時http.Server出現和啓動時得到通知聽:http.Server開始監聽

ListenAndServe(":8080", nil) 

該函數在服務器實際關閉之前不會返回。我也看了一下服務器類型,但似乎沒有什麼能讓我進入這個時機。某些功能或頻道本來很好,但我沒有看到。

有沒有什麼辦法可以讓我檢測到這個事件,還是我只剩下「足夠」地假裝它?

+0

你的意思的東西像一個'log'? – AndreaM16

+0

您是否想知道監聽器何時創建?你想解決什麼問題?如果您想使用['Server.Serve'](https://golang.org/pkg/net/http/#Server.Serve),您可以直接將偵聽器傳遞給服務器。 – JimB

+0

我希望能夠採取某些措施,例如「此http服務器已開放」。例如,可以設想一種場景,您希望將此服務器註冊到註冊表中,以便在服務器啓動並實際接受連接時它成爲某個服務發現的一部分。然後客戶端可以發現這個實例並開始發送流量。 我懷疑聽衆創建是一個答案,因爲它僅僅是創建監聽器實例,但實際上並沒有在這一點上接受連接,對不對? – sjlee

回答

2

ListenAndServe是一個幫助函數,它打開一個偵聽套接字,然後在該套接字上提供連接。直接把代碼寫在你的應用程序時,插座是開放的信號:

l, err := net.Listen("tcp", ":8080") 
if err != nil { 
    // handle error 
} 

// Signal that server is open for business. 

if err := http.Serve(l, rootHandler); err != nil { 
    // handle error 
} 

如果信令步驟不阻止,那麼http.Serve會輕易地消耗掉監聽套接字上的任何積壓。

相關問題:https://stackoverflow.com/a/32742904/5728991

+1

我會接受答案。謝謝!一個需要注意的是監聽器路由更加涉及,特別是ListenAndServeTLS()。看起來你最終會複製一些http/Server代碼以具有相同的行爲。見https://github.com/golang/go/issues/14374和https://github.com/golang/go/commit/b5f0aff49503e31002b33198e06708e263c445a7。 – sjlee