func GetOrderAssignmentApi(ctx *gin.Context) { upGrader := websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } ws, err := upGrader.Upgrade(ctx.Writer, ctx.Request, nil) if err != nil { ws.WriteMessage(websocket.TextMessage, []byte(msg.LinkISDisconnect)) ws.Close() return } defer ws.Close() workUserName, _ := ctx.Get("username") orm := database.GetSystemDb() var workuser models.WorkUser orm.Where("account=?", workUserName).First(&workuser) // 绑定到当前节点 node := &Node{ Conn: ws, DataQueue: make(chan []byte, 50), } // 映射关系的绑定 rwLocker.Lock() clientMap[workuser.Id] = node rwLocker.Unlock() for { go senProc(node) } }设置心跳包
时间: 2024-03-01 15:54:34 浏览: 141
在上面的代码中,我们使用了 `github.com/gorilla/websocket` 库来建立 WebSocket 连接,并实现了一个简单的心跳包检测机制。以下是示例代码:
```go
func GetOrderAssignmentApi(ctx *gin.Context) {
upGrader := websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true
},
}
ws, err := upGrader.Upgrade(ctx.Writer, ctx.Request, nil)
if err != nil {
ws.WriteMessage(websocket.TextMessage, []byte(msg.LinkISDisconnect))
ws.Close()
return
}
defer ws.Close()
workUserName, _ := ctx.Get("username")
orm := database.GetSystemDb()
var workuser models.WorkUser
orm.Where("account=?", workUserName).First(&workuser)
// 绑定到当前节点
node := &Node{
Conn: ws,
DataQueue: make(chan []byte, 50),
}
// 映射关系的绑定
rwLocker.Lock()
clientMap[workuser.Id] = node
rwLocker.Unlock()
// 启动心跳包检测
go heartbeat(node)
for {
go senProc(node)
}
}
func heartbeat(node *Node) {
// 发送心跳包的间隔时间
interval := 5 * time.Second
// 超时时间
timeout := 10 * time.Second
// 心跳包数据
heartbeatMsg := []byte("heartbeat")
for {
// 发送心跳包
err := node.Conn.WriteMessage(websocket.TextMessage, heartbeatMsg)
if err != nil {
fmt.Println("Failed to send heartbeat:", err)
node.Close()
return
}
// 设置读取超时时间
node.Conn.SetReadDeadline(time.Now().Add(timeout))
// 接收响应
_, _, err = node.Conn.ReadMessage()
if err != nil {
fmt.Println("Failed to receive heartbeat response:", err)
node.Close()
return
}
// 等待下一次发送心跳包
time.Sleep(interval)
}
}
```
在上面的代码中,我们在 `GetOrderAssignmentApi` 函数中建立了 WebSocket 连接,并将连接绑定到一个节点上。然后,在绑定完成后,我们启动了一个 goroutine 来执行 `heartbeat` 函数,实现心跳包检测。在 `heartbeat` 函数中,我们定时发送心跳包并等待响应,如果在超时时间内没有收到响应,则关闭连接。注意,在 `GetOrderAssignmentApi` 函数中,我们还是需要在一个无限循环中不断调用 `senProc` 函数,以便监听节点上的消息队列并发送数据。
阅读全文