既有适合小白学习的零基础资料,也有适合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/c31d33682ce629a11ef10a761747c148.png)
![img](https://img-blog.csdnimg.cn/img_convert/22781bcf52cdd98fb60781dcad2948b0.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**