欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang實現(xiàn)心跳機制的示例詳解

 更新時間:2024年04月23日 10:34:16   作者:谷隱凡二  
這篇文章主要為大家詳細(xì)介紹了Golang實現(xiàn)心跳機制的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考一下

1、服務(wù)端代碼

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)
 
		// 回復(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
		}
 
		// 啟動一個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提供了一個內(nèi)置的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消息作為心跳包。

第三步:處理心跳響應(yīng)

最后,我們需要處理來自客戶端的心跳響應(yīng)。如果客戶端未在規(guī)定的時間內(nèi)響應(yīng)心跳包,我們可以將其標(biāo)記為離線狀態(tài)。以下是一個示例代碼,用于處理心跳響應(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è)置一個10秒的讀取超時時間。如果在超時時間內(nèi)未收到心跳響應(yīng),將會觸發(fā)ReadMessage函數(shù)返回錯誤。我們可以在錯誤處理程序中添加適當(dāng)?shù)牟僮?,如重新連接或關(guān)閉連接。

到此這篇關(guān)于Golang實現(xiàn)心跳機制的示例詳解的文章就介紹到這了,更多相關(guān)Go心跳機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang通過mysql語句實現(xiàn)分頁查詢

    golang通過mysql語句實現(xiàn)分頁查詢

    這篇文章主要介紹了golang通過mysql語句實現(xiàn)分頁查詢,文章內(nèi)容介紹詳細(xì),具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-03-03
  • Go?語言前綴樹實現(xiàn)敏感詞檢測

    Go?語言前綴樹實現(xiàn)敏感詞檢測

    這篇文章主要為大家介紹了Go語言前綴樹實現(xiàn)敏感詞檢測實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Go語言中使用反射的方法

    Go語言中使用反射的方法

    這篇文章主要介紹了Go語言中使用反射的方法,實例分析了Go語言實現(xiàn)反射的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Go實現(xiàn)跨平臺的藍(lán)牙聊天室示例詳解

    Go實現(xiàn)跨平臺的藍(lán)牙聊天室示例詳解

    這篇文章主要為大家介紹了Go實現(xiàn)跨平臺的藍(lán)牙聊天室示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go實現(xiàn)基于RSA加密算法的接口鑒權(quán)

    Go實現(xiàn)基于RSA加密算法的接口鑒權(quán)

    這篇文章主要介紹了Go實現(xiàn)基于RSA加密算法的接口鑒權(quán),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • Go語言基礎(chǔ)學(xué)習(xí)之指針詳解

    Go語言基礎(chǔ)學(xué)習(xí)之指針詳解

    Go 語言中指針是很容易學(xué)習(xí)的,Go 語言中使用指針可以更簡單的執(zhí)行一些任務(wù)。所以本文就來和大家聊聊Go語言中指針的定義與使用,需要的可以參考一下
    2022-12-12
  • golang開發(fā)中channel使用

    golang開發(fā)中channel使用

    channel[通道]是golang的一種重要特性,正是因為channel的存在才使得golang不同于其它語言。這篇文章主要介紹了golang開發(fā)中channel使用,需要的朋友可以參考下
    2020-09-09
  • 修改并編譯golang源碼的操作步驟

    修改并編譯golang源碼的操作步驟

    這篇文章主要介紹了修改并編譯golang源碼的操作步驟,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • golang監(jiān)聽文件變化的實例

    golang監(jiān)聽文件變化的實例

    這篇文章主要介紹了golang監(jiān)聽文件變化的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Windows系統(tǒng)中搭建Go語言開發(fā)環(huán)境圖文詳解

    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

最新評論