应用集成平台服务端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
2.2 KiB

1 year ago
package webstocetmsg
import (
"fmt"
"sync"
"time"
"github.com/golang-module/carbon"
)
var GatewayClients, GatewayUser, GatewayGroup sync.Map
/**
* @description: 客户端心跳检测超时即断开连接主要是为了降低服务端承载压力
* @param {string} clientID
* @return {*}
*/
func clientHeartbeatCheck(clientID string) {
for {
time.Sleep(5 * time.Second)
clientInterface, exists := GatewayClients.Load(clientID)
if !exists {
break
}
client, _ := clientInterface.(*WebSocketClientBase)
if (carbon.Now().Timestamp() - client.LastHeartbeat) > int64(HeartbeatTime) {
fmt.Println("Client", clientID, "heartbeat timeout")
client.Conn.Close()
GatewayClients.Delete(clientID)
break
}
}
}
/**
* @description: 客户端断线时自动踢出Uid绑定列表
* @param {string} clientID
* @param {string} uid
* @return {*}
*/
func clientUnBindUid(clientID string, uid string) {
value, ok := GatewayUser.Load(uid)
if ok {
users := value.(*WebSocketUserBase)
for k, v := range users.ClientID {
if v == clientID {
users.ClientID = append(users.ClientID[:k], users.ClientID[k+1:]...)
}
}
if len(users.ClientID) == 0 {
GatewayUser.Delete(uid)
}
}
}
/**
* @description: 客户端断线时自动踢出已加入的群组
* @param {string} clientID
* @return {*}
*/
func clientLeaveGroup(clientID string) {
// 使用 Load 方法获取值
value, ok := GatewayClients.Load(clientID)
if !ok {
// 如果没有找到对应的值,处理相应的逻辑
return
}
client := value.(*WebSocketClientBase)
// 遍历 JoinGroup
for _, v := range client.JoinGroup {
// 使用 Load 方法获取值
groupValue, groupOK := GatewayGroup.Load(v)
if !groupOK {
// 如果没有找到对应的值,处理相应的逻辑
continue
}
group := groupValue.(*WebSocketGroupBase)
// 在群组中找到对应的 clientID,并删除
for j, id := range group.ClientID {
if id == clientID {
copy(group.ClientID[j:], group.ClientID[j+1:])
group.ClientID = group.ClientID[:len(group.ClientID)-1]
// 如果群组中没有成员了,删除群组
if len(group.ClientID) == 0 {
GatewayGroup.Delete(v)
}
break
}
}
}
}