Golang實(shí)現(xiàn)心跳機(jī)制的示例詳解
1、服務(wù)端代碼
package main import ( "fmt" "net" ) func handleClient(conn net.Conn) { defer conn.Close() fmt.Println("Client connected:", conn.RemoteAddr()) // 讀取客戶(hù)端的數(shù)據(jù) buffer := make([]byte, 1024) for { n, err := conn.Read(buffer) if err != nil { fmt.Println("Error reading:", err) return } // 處理接收到的數(shù)據(jù) data := string(buffer[:n]) fmt.Printf("Received from %s: %s\n", conn.RemoteAddr(), data) // 回復(fù)心跳響應(yīng) response := "Heartbeat response" conn.Write([]byte(response)) } } func main() { listener, err := net.Listen("tcp", ":8080") if err != nil { fmt.Println("Error:", err) return } defer listener.Close() fmt.Println("Heartbeat server listening on :8080") for { conn, err := listener.Accept() if err != nil { fmt.Println("Error accepting connection:", err) continue } // 啟動(dòng)一個(gè)goroutine處理客戶(hù)端連接 go handleClient(conn) } }
2、客戶(hù)端代碼
package main import ( "fmt" "net" "time" ) func sendHeartbeat(conn net.Conn) { for { // 發(fā)送心跳數(shù)據(jù) heartbeat := "Heartbeat message" conn.Write([]byte(heartbeat)) // 等待一段時(shí)間再發(fā)送下一次心跳 time.Sleep(time.Second * 5) } } func main() { conn, err := net.Dial("tcp", "localhost:8080") if err != nil { fmt.Println("Error connecting to server:", err) return } defer conn.Close() fmt.Println("Connected to server:", conn.RemoteAddr()) // 啟動(dòng)goroutine發(fā)送心跳 go sendHeartbeat(conn) // 主goroutine保持運(yùn)行,等待心跳 select {} }
3、最終實(shí)現(xiàn)效果
4、方法補(bǔ)充
除了上文的方法,小編還為大家整理了其他golang實(shí)現(xiàn)心跳機(jī)制的方法,希望對(duì)大家有所幫助
第一步:創(chuàng)建WebSocket連接
首先,我們需要?jiǎng)?chuàng)建一個(gè)WebSocket連接。Golang提供了一個(gè)內(nèi)置的websocket
包,可以方便地創(chuàng)建和管理WebSocket連接。以下是一個(gè)簡(jiǎn)單的示例代碼,用于創(chuàng)建一個(gè)WebSocket連接:
package main import ( “l(fā)og” “net/http” “github.com/gorilla/websocket” ) var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } func main() { http.HandleFunc(“/ws”, func(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println(err) return } }) log.Fatal(http.ListenAndServe(“:8080”, nil)) }
第二步:添加心跳處理程序
接下來(lái),我們需要添加一個(gè)心跳處理程序,用于定期發(fā)送心跳包。我們可以使用goroutine和定時(shí)器來(lái)實(shí)現(xiàn)這個(gè)功能。以下是一個(gè)示例代碼,用于添加心跳處理程序:
package main import ( “l(fā)og” “net/http” “time” “github.com/gorilla/websocket” ) var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } func main() { http.HandleFunc(“/ws”, func(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println(err) return } go heartbeat(conn) // 處理其他操作 }) log.Fatal(http.ListenAndServe(“:8080”, nil)) } func heartbeat(conn *websocket.Conn) { ticker := time.NewTicker(5 * time.Second) defer ticker.Stop() for { select { case <-ticker.C: err := conn.WriteMessage(websocket.PingMessage, []byte(“heartbeat”)) if err != nil { log.Println(err) return } } } }
在上面的代碼中,我們使用time.NewTicker函數(shù)創(chuàng)建了一個(gè)定時(shí)器,每隔5秒觸發(fā)一次。然后,我們使用conn.WriteMessage函數(shù)發(fā)送一個(gè)WebSocket ping消息作為心跳包。
第三步:處理心跳響應(yīng)
最后,我們需要處理來(lái)自客戶(hù)端的心跳響應(yīng)。如果客戶(hù)端未在規(guī)定的時(shí)間內(nèi)響應(yīng)心跳包,我們可以將其標(biāo)記為離線(xiàn)狀態(tài)。以下是一個(gè)示例代碼,用于處理心跳響應(yīng):
package main import ( “l(fā)og” “net/http” “time” “github.com/gorilla/websocket” ) var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } func main() { http.HandleFunc(“/ws”, func(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println(err) return } go heartbeat(conn) // 處理其他操作 }) log.Fatal(http.ListenAndServe(“:8080”, nil)) } func heartbeat(conn *websocket.Conn) { ticker := time.NewTicker(5 * time.Second) defer ticker.Stop() for { select { case <-ticker.C: err := conn.WriteMessage(websocket.PingMessage, []byte(“heartbeat”)) if err != nil { log.Println(err) return } conn.SetReadDeadline(time.Now().Add(10 * time.Second)) _, _, err = conn.ReadMessage() if err != nil { log.Println(“heartbeat response error:”, err) return } } } }
在上述代碼中,我們使用conn.SetReadDeadline
函數(shù)設(shè)置一個(gè)10秒的讀取超時(shí)時(shí)間。如果在超時(shí)時(shí)間內(nèi)未收到心跳響應(yīng),將會(huì)觸發(fā)ReadMessage
函數(shù)返回錯(cuò)誤。我們可以在錯(cuò)誤處理程序中添加適當(dāng)?shù)牟僮?,如重新連接或關(guān)閉連接。
到此這篇關(guān)于Golang實(shí)現(xiàn)心跳機(jī)制的示例詳解的文章就介紹到這了,更多相關(guān)Go心跳機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang通過(guò)mysql語(yǔ)句實(shí)現(xiàn)分頁(yè)查詢(xún)
這篇文章主要介紹了golang通過(guò)mysql語(yǔ)句實(shí)現(xiàn)分頁(yè)查詢(xún),文章內(nèi)容介紹詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助2022-03-03Go?語(yǔ)言前綴樹(shù)實(shí)現(xiàn)敏感詞檢測(cè)
這篇文章主要為大家介紹了Go語(yǔ)言前綴樹(shù)實(shí)現(xiàn)敏感詞檢測(cè)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Go實(shí)現(xiàn)跨平臺(tái)的藍(lán)牙聊天室示例詳解
這篇文章主要為大家介紹了Go實(shí)現(xiàn)跨平臺(tái)的藍(lán)牙聊天室示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Go實(shí)現(xiàn)基于RSA加密算法的接口鑒權(quán)
這篇文章主要介紹了Go實(shí)現(xiàn)基于RSA加密算法的接口鑒權(quán),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06Go語(yǔ)言基礎(chǔ)學(xué)習(xí)之指針詳解
Go 語(yǔ)言中指針是很容易學(xué)習(xí)的,Go 語(yǔ)言中使用指針可以更簡(jiǎn)單的執(zhí)行一些任務(wù)。所以本文就來(lái)和大家聊聊Go語(yǔ)言中指針的定義與使用,需要的可以參考一下2022-12-12golang監(jiān)聽(tīng)文件變化的實(shí)例
這篇文章主要介紹了golang監(jiān)聽(tīng)文件變化的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03Windows系統(tǒng)中搭建Go語(yǔ)言開(kāi)發(fā)環(huán)境圖文詳解
GoLand?是?JetBrains?公司推出的商業(yè)?Go?語(yǔ)言集成開(kāi)發(fā)環(huán)境(IDE),這篇文章主要介紹了Windows系統(tǒng)中搭建Go語(yǔ)言開(kāi)發(fā)環(huán)境詳解,需要的朋友可以參考下2022-10-10