2024年最全Golang WebSocket 心跳(3),2024年最新Golang开发入门基础教程

2024年最全Golang WebSocket 心跳(3),2024年最新Golang开发入门基础教程既有适合小白学习的零基础资料 也有适合 3 年以上经验的小伙伴深入学习提升的进阶课程 涵盖了 95 以上 Go 语言开发知识点 真正体系化 由于文件比较多 这里只是将部分目录截图出来 全套包含大厂面经 学习笔记 源码讲义 实战项目 大纲路线 讲解视频 并且后续会持续更新

大家好,我是讯享网,很高兴认识大家。

img
讯享网
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

如何实现WebSocket心跳

在Golang中,可以使用goroutine和定时器来实现WebSocket的心跳机制。以下是实现WebSocket心跳的步骤:

第一步:创建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 WebSocket心跳的案例:

案例一:在线聊天应用

在一个在线聊天应用中,心跳机制可以用来检测用户的在线状态。当用户长时间没有发送消息时,服务器可以通过心跳机制检测到用户离线,并从在线用户列表中移除该用户。

讯享网func heartbeat(conn \*websocket.Conn) { ticker := time.NewTicker(5 \* time.Second) defer ticker.Stop() for { ![img](https://img-blog.csdnimg.cn/img_convert/e93db8ccaf5de83de20623b255ee556b.png) ![img](https://img-blog.csdnimg.cn/img_convert/c31d33682ce629a11ef10ac148.png) ![img](https://img-blog.csdnimg.cn/img_convert/22781bcf52cdd98fb60781dcad2948b0.png) 既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化! 由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新 [如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/) 既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化! 由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新 [如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/) 
小讯
上一篇 2025-04-03 16:05
下一篇 2025-01-04 21:47

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/20346.html