goProject/trunk/game/common/clientMgr/clientMgr.go
2025-01-15 17:36:12 +08:00

110 lines
2.4 KiB
Go

package clientMgr
import (
"encoding/json"
"sync"
"goutil/debugUtil"
"goutil/logUtil"
)
var (
clientMap = make(map[int32]IClient, 1024)
mutex sync.RWMutex
)
func RegisterClient(clientObj IClient) {
mutex.Lock()
defer mutex.Unlock()
clientMap[clientObj.GetId()] = clientObj
}
func UnregisterClient(clientObj IClient) {
mutex.Lock()
defer mutex.Unlock()
delete(clientMap, clientObj.GetId())
}
func GetClient(id int32) (clientObj IClient, exists bool) {
mutex.RLock()
defer mutex.RUnlock()
clientObj, exists = clientMap[id]
return
}
func getClientCount() int {
mutex.RLock()
defer mutex.RUnlock()
return len(clientMap)
}
func getExpiredClientList() (expiredList []IClient) {
mutex.RLock()
defer mutex.RUnlock()
for _, item := range clientMap {
if item.Expired() {
expiredList = append(expiredList, item)
}
}
return
}
// 绑定连接到玩家
func BindClientAndPlayer(clientObj IClient, playerObj *Player) {
// 发送在另一台设备登陆的信息
sendLoginAnotherDeviceMsg := func(clientObj IClient) {
responseObj := NewServerResponseObject()
responseObj.SetMethodName("Login")
responseObj.SetResultStatus(LoginOnAnotherDevice)
mes, _ := json.Marshal(responseObj)
if debugUtil.IsDebug() {
logUtil.WarnLog("BindClientAndPlayer11BindClientAndPlayer:%v", string(mes))
}
// 先发送消息,然后再断开连接
clientObj.SendMessage(responseObj)
clientObj.SendMessage(NewDisconnectServerResponseObject())
}
// 立即更新活跃时间,避免在将要清除时,玩家又登陆的极端情况
clientObj.Active()
clientObj.ClearSendData()
// 判断是否重复登陆
if playerObj.ClientId > 0 {
if oldClientObj, exist := GetClient(playerObj.ClientId); exist {
// 如果不是同一个客户端,则先给客户端发送在其他设备登陆信息,然后断开连接
if clientObj != oldClientObj {
sendLoginAnotherDeviceMsg(oldClientObj)
}
}
}
// 更新客户端对象的玩家Id、以及玩家对象对应的客户端Id
clientObj.PlayerLogin(playerObj.Id)
playerObj.ClientLogin(clientObj.GetId())
}
// Disconnect 清理断开的连接数据
// / 连接对象
func Disconnect(clientObj IClient) {
if clientObj.GetPlayerId() != 0 {
playerObj, exist, err := getPlayerHandler(clientObj.GetPlayerId(), false)
if err == nil && exist && clientObj.GetId() == playerObj.ClientId {
playerObj.ClientLogout()
}
}
clientObj.Close()
UnregisterClient(clientObj)
}