设置一个全局变量,把在线的用户计入到全局变量,未在线的就删除掉
时间: 2024-03-01 17:54:50 浏览: 98
微信小程序 App全局变量 保存 修改 读取,滑动删除
5星 · 资源好评率100%
可以使用一个 map 类型的全局变量来记录在线用户,key 值为用户 ID,value 值可以为一个结构体,来记录用户的其他信息,例如连接时间等。可以在每次心跳包发送成功后,将当前用户 ID 记录到该全局变量中,若未收到响应,则从该全局变量中删除该用户 ID。
以下是示例代码:
```go
type User struct {
ConnTime time.Time // 连接时间
}
var onlineUsers map[string]User // 在线用户列表
func heartbeat(node *Node, userID string) {
// 发送心跳包的间隔时间
interval := 20 * time.Second
// 超时时间
timeout := 60 * time.Second
// 心跳包数据
heartbeatMsg := []byte("ping")
for {
// 发送心跳包
err := node.Conn.WriteMessage(websocket.TextMessage, heartbeatMsg)
if err != nil {
fmt.Println("Failed to send heartbeat:", err)
node.Conn.Close()
delete(onlineUsers, userID) // 删除不在线的用户
return
}
// 设置读取超时时间
node.Conn.SetReadDeadline(time.Now().Add(timeout))
// 接收响应
_, msg, err := node.Conn.ReadMessage()
if err != nil {
fmt.Println("Failed to receive heartbeat response:", err)
node.Conn.Close()
delete(onlineUsers, userID) // 删除不在线的用户
return
}
// 判断响应是否为 "pong"
if string(msg) != "pong" {
fmt.Println("Invalid heartbeat response:", string(msg))
node.Conn.Close()
delete(onlineUsers, userID) // 删除不在线的用户
return
}
// 记录在线用户
onlineUsers[userID] = User{ConnTime: time.Now()}
// 等待下一次发送心跳包
time.Sleep(interval)
}
}
```
在此基础上,可以添加一个定时任务,定时清除长时间未响应的用户。例如:
```go
func clearTimeoutUsers() {
for {
time.Sleep(10 * time.Minute)
now := time.Now()
for userID, user := range onlineUsers {
if now.Sub(user.ConnTime) > 30*time.Minute { // 超过30分钟未响应,则认为不在线
delete(onlineUsers, userID)
}
}
}
}
```
注意:这里的时间设置都是示例,具体时间可以根据实际情况进行调整。
阅读全文