Golang WebSocket 心跳,技术实现
package main
import (
"fmt"
"github.com/gorilla/websocket"
"log"
"net/http"
"time"
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true // 允许跨域请求
},
}
func heartbeat(ws *websocket.Conn) {
ticker := time.NewTicker(time.Second * 5)
defer ticker.Stop()
for range ticker.C {
err := ws.WriteControl(websocket.PingMessage, []byte{}, time.Now().Add(time.Second))
if err != nil {
log.Printf("write ping error: %v", err)
return
}
}
}
func serveWs(w http.ResponseWriter, r *http.Request) {
ws, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
defer ws.Close()
go heartbeat(ws)
for {
_, _, err := ws.Read(nil)
if err != nil {
log.Println("read:", err)
break
}
}
}
func main() {
http.HandleFunc("/ws", serveWs)
fmt.Println("Starting server on :8080")
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
这段代码使用Gorilla WebSocket库实现了一个简单的WebSocket服务器,其中包含了心跳检测的逻辑。heartbeat
函数创建了一个每5秒触发一次的计时器,并通过WebSocket连接发送Ping消息。如果在指定的延迟时间内没有收到回复,则认为连接已经断开,并停止心跳操作。这个简单的例子展示了如何在WebSocket连接中实现心跳机制,以保持连接的活跃性。
评论已关闭