首頁  >  文章  >  後端開發  >  go中如何關閉http埠?

go中如何關閉http埠?

王林
王林轉載
2024-02-09 17:24:19682瀏覽

go中如何關閉http埠?

在Go語言中,關閉HTTP連接埠可以透過使用`http.Server`的`Close()`方法來實現。首先,我們需要建立一個`http.Server`實例並監聽指定的連接埠。一旦伺服器開始運行,我們可以透過呼叫`Close()`方法來停止伺服器。這將導致正在運行的HTTP伺服器立即停止並釋放監聽的連接埠。另外,我們也可以使用訊號量來優雅地關閉HTTP伺服器,例如使用`os.Interrupt`訊號來擷取Ctrl C事件並在收到訊號時關閉伺服器。總而言之,Go語言提供了簡單且靈活的方法來關閉HTTP端口,讓我們能夠更好地控制伺服器的運作。

問題內容

我剛剛學習 go,並創建簡單的網頁應用程式。但是每次我在 go 中啟動本機主機(即使我在終端機中停止進程),它也不會關閉連接埠。那麼我該如何關閉它。

這是程式碼

const portNumber = ":8080"
func main() {
http.HandleFunc("/", Home)
http.HandleFunc("/about", About)

fmt.Println(fmt.Sprintf("Starting on port %s", portNumber))
_ = http.ListenAndServe(portNumber, nil)
}

我在網路上做了研究,但找不到解決方案,所以希望你能幫助我。謝謝

解決方法

我認為首先重要的是重新表達你的問題並真正理解你在問什麼。 不存在封閉的 http 連接埠之類的東西。 這就是 http server 在非常高的層面上的工作方式:

  1. #因此,當您要求 http 伺服器開始偵聽某個連接埠時,您基本上是在要求作業系統建立一個代表端點的 internet 套接字。從端點來看,我的意思是 ip: port。

  2. 在 http 1、1.1 和 2 的情況下,該套接字尤其是 tcp 網路套接字。

  3. 該套接字正在偵聽階段運行,並且正在偵聽任何傳入的連接請求。如果它收到任何傳入請求,那麼核心將簡單地進行3 路tcp 握手,在成功握手後,核心會建立連接物件並將其移交給代表後端應用程式的進程,您將在其中偵聽任何新連接創建的。 所以你會看到port 一直存在於你的系統中,你在啟動http 伺服器時沒有創建一個新的port,但基本上創建了一個internet 套接字物件並要求你的核心開始偵聽該port 以獲取新連接並將其移交創建連接時到您的後端應用程式。 所以你基本上是在問我如何停止在該端點處監聽並要求核心刪除該互聯網套接字。 下面是一個粗略的程式碼段,可讓您了解如何執行此操作。

    import (
     "context"
     "log"
     "net/http"
     "os"
     "os/signal"
     "syscall"
     "time"
     )
     func main() {
         server := &http.Server{Addr: ":8080", Handler: myHandler}
         go server.ListenAndServe()
    
         interrupt := make(chan os.Signal, 1)
         signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM)
    
         <-interrupt
         log.Println("Shutting down server...")
    
         ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
         defer cancel()
    
         if err := server.Shutdown(ctx); err != nil {
             log.Fatal("Server forced to shutdown:", err)
         }
         log.Println("Server stopped")
     }
    
     func myHandler(w http.ResponseWriter, r *http.Request) {
         // Handle requests
     }

以上是go中如何關閉http埠?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除