目錄
問題內容
解決方法
首頁 後端開發 Golang go中如何關閉http埠?

go中如何關閉http埠?

Feb 09, 2024 pm 05:24 PM
go語言

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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1659
14
CakePHP 教程
1416
52
Laravel 教程
1310
25
PHP教程
1258
29
C# 教程
1232
24
在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? 在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? Apr 02, 2025 pm 04:54 PM

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

Go的爬蟲Colly中Queue線程的問題是什麼? Go的爬蟲Colly中Queue線程的問題是什麼? Apr 02, 2025 pm 02:09 PM

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

GoLand中自定義結構體標籤不顯示怎麼辦? GoLand中自定義結構體標籤不顯示怎麼辦? Apr 02, 2025 pm 05:09 PM

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...

在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? 在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? Apr 02, 2025 pm 02:03 PM

Go語言中字符串打印的區別:使用Println與string()函數的效果差異在Go...

Go語言中用於浮點數運算的庫有哪些? Go語言中用於浮點數運算的庫有哪些? Apr 02, 2025 pm 02:06 PM

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

Go語言中`var`和`type`關鍵字定義結構體的區別是什麼? Go語言中`var`和`type`關鍵字定義結構體的區別是什麼? Apr 02, 2025 pm 12:57 PM

Go語言中結構體定義的兩種方式:var與type關鍵字的差異Go語言在定義結構體時,經常會看到兩種不同的寫法:一�...

Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Apr 02, 2025 pm 04:12 PM

Go語言中哪些庫是大公司開發或知名開源項目?在使用Go語言進行編程時,開發者常常會遇到一些常見的需求,�...

使用 sql.Open 時,DSN 傳空為什麼不報錯? 使用 sql.Open 時,DSN 傳空為什麼不報錯? Apr 02, 2025 pm 12:54 PM

使用sql.Open時,DSN傳空為什麼不報錯?在Go語言中,sql.Open...

See all articles