脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Golang - Golang实现心跳机制的示例详解

Golang实现心跳机制的示例详解

2024-04-23 16:22谷隐凡二 Golang

这篇文章主要为大家详细介绍了Golang实现心跳机制的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下

1、服务端代码

package main
 
import (
	"fmt"
	"net"
)
 
func handleClient(conn net.Conn) {
	defer conn.Close()
 
	fmt.Println("Client connected:", conn.RemoteAddr())
 
	// 读取客户端的数据
	buffer := make([]byte, 1024)
	for {
		n, err := conn.Read(buffer)
		if err != nil {
			fmt.Println("Error reading:", err)
			return
		}
 
		// 处理接收到的数据
		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 {
		// 发送心跳数据
		heartbeat := "Heartbeat message"
		conn.Write([]byte(heartbeat))
 
		// 等待一段时间再发送下一次心跳
		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发送心跳
	go sendHeartbeat(conn)
 
	// 主goroutine保持运行,等待心跳
	select {}
}

3、最终实现效果

Golang实现心跳机制的示例详解

4、方法补充

除了上文的方法,小编还为大家整理了其他golang实现心跳机制的方法,希望对大家有所帮助

第一步:创建WebSocket连接

首先,我们需要创建一个WebSocket连接。Golang提供了一个内置的websocket包,可以方便地创建和管理WebSocket连接。以下是一个简单的示例代码,用于创建一个WebSocket连接:

package main

import (
“log”
“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))
}

第二步:添加心跳处理程序

接下来,我们需要添加一个心跳处理程序,用于定期发送心跳包。我们可以使用goroutine和定时器来实现这个功能。以下是一个示例代码,用于添加心跳处理程序:

package main

import (
“log”
“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函数创建了一个定时器,每隔5秒触发一次。然后,我们使用conn.WriteMessage函数发送一个WebSocket ping消息作为心跳包。

第三步:处理心跳响应

最后,我们需要处理来自客户端的心跳响应。如果客户端未在规定的时间内响应心跳包,我们可以将其标记为离线状态。以下是一个示例代码,用于处理心跳响应:

package main

import (
“log”
“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函数设置一个10秒的读取超时时间。如果在超时时间内未收到心跳响应,将会触发ReadMessage函数返回错误。我们可以在错误处理程序中添加适当的操作,如重新连接或关闭连接。

到此这篇关于Golang实现心跳机制的示例详解的文章就介绍到这了,更多相关Go心跳机制内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_37570494/article/details/138083993

延伸 · 阅读

精彩推荐
  • Golanggolang如何通过viper读取config.yaml文件

    golang如何通过viper读取config.yaml文件

    这篇文章主要介绍了golang通过viper读取config.yaml文件,围绕golang读取config.yaml文件的相关资料展开详细内容,需要的小伙伴可以参考一下...

    峰啊疯了6352022-09-07
  • Golang深入了解Go项目标准目录布局

    深入了解Go项目标准目录布局

    本文主要介绍了Go项目标准目录布局,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    程序员读书10822022-10-07
  • GolangGo 切片只需这一篇!

    Go 切片只需这一篇!

    切片在 golang 是一种很重要的数据结构,大家平时工作和面试都会遇到,而且切片需要注意的点比较多,只有深入去理解它,才能避免采坑。下面开始发车...

    盼盼编程5622021-08-06
  • GolangGoFrame框架数据校验之校验结果Error接口对象

    GoFrame框架数据校验之校验结果Error接口对象

    这篇文章主要为大家介绍了GoFrame框架数据校验之校验结果Error接口对象示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早...

    王中阳Go10512022-10-24
  • Golanggo 对象池化组件 bytebufferpool使用详解

    go 对象池化组件 bytebufferpool使用详解

    这篇文章主要为大家介绍了go 对象池化组件 bytebufferpool使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    FfFJ6442022-11-25
  • GolangGo单元测试对GORM进行Mock测试

    Go单元测试对GORM进行Mock测试

    这篇文章主要为大家介绍了Go单元测试对GORM进行Mock测试用例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    kevinyan4362022-10-25
  • Golanggo语言同步教程之条件变量

    go语言同步教程之条件变量

    这篇文章主要给大家介绍了关于go语言同步教程之条件变量的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价...

    domac的菜园子2702020-05-17
  • GolangGo语言变量与基础数据类型详情

    Go语言变量与基础数据类型详情

    Go 是静态(编译型)语言,是区别于解释型语言的弱类型语言(静态:类型固定,强类型:不同类型不允许直接运算),下面文章将对其进行详细介绍,需要...

    Mr-Yang`6622021-11-17