Golang實現(xiàn)心跳機制的示例詳解
1、服務端代碼
package main
import (
"fmt"
"net"
)
func handleClient(conn net.Conn) {
defer conn.Close()
fmt.Println("Client connected:", conn.RemoteAddr())
// 讀取客戶端的數(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)
// 回復心跳響應
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
}
// 啟動一個goroutine處理客戶端連接
go handleClient(conn)
}
}2、客戶端代碼
package main
import (
"fmt"
"net"
"time"
)
func sendHeartbeat(conn net.Conn) {
for {
// 發(fā)送心跳數(shù)據(jù)
heartbeat := "Heartbeat message"
conn.Write([]byte(heartbeat))
// 等待一段時間再發(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())
// 啟動goroutine發(fā)送心跳
go sendHeartbeat(conn)
// 主goroutine保持運行,等待心跳
select {}
}3、最終實現(xiàn)效果

4、方法補充
除了上文的方法,小編還為大家整理了其他golang實現(xiàn)心跳機制的方法,希望對大家有所幫助
第一步:創(chuàng)建WebSocket連接
首先,我們需要創(chuàng)建一個WebSocket連接。Golang提供了一個內置的websocket包,可以方便地創(chuàng)建和管理WebSocket連接。以下是一個簡單的示例代碼,用于創(chuàng)建一個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))
}第二步:添加心跳處理程序
接下來,我們需要添加一個心跳處理程序,用于定期發(fā)送心跳包。我們可以使用goroutine和定時器來實現(xiàn)這個功能。以下是一個示例代碼,用于添加心跳處理程序:
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)建了一個定時器,每隔5秒觸發(fā)一次。然后,我們使用conn.WriteMessage函數(shù)發(fā)送一個WebSocket ping消息作為心跳包。
第三步:處理心跳響應
最后,我們需要處理來自客戶端的心跳響應。如果客戶端未在規(guī)定的時間內響應心跳包,我們可以將其標記為離線狀態(tài)。以下是一個示例代碼,用于處理心跳響應:
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ù)設置一個10秒的讀取超時時間。如果在超時時間內未收到心跳響應,將會觸發(fā)ReadMessage函數(shù)返回錯誤。我們可以在錯誤處理程序中添加適當?shù)牟僮?,如重新連接或關閉連接。
到此這篇關于Golang實現(xiàn)心跳機制的示例詳解的文章就介紹到這了,更多相關Go心跳機制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Windows系統(tǒng)中搭建Go語言開發(fā)環(huán)境圖文詳解
GoLand?是?JetBrains?公司推出的商業(yè)?Go?語言集成開發(fā)環(huán)境(IDE),這篇文章主要介紹了Windows系統(tǒng)中搭建Go語言開發(fā)環(huán)境詳解,需要的朋友可以參考下2022-10-10

