110 lines
2.4 KiB
Go
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)
|
|
}
|