pet_home_server/src/server/cluster/ClusterFunc.go
2025-01-22 18:47:48 +08:00

157 lines
3.6 KiB
Go

package mergeCluster
import (
"fmt"
"server/GoUtil"
"server/conf"
"server/game/mod/msg"
"server/pkg/github.com/name5566/leaf/log"
"server/pkg/github.com/name5566/leaf/network"
"time"
)
func RevcServerMsg(m *msg.Msg) error {
log.Debug("RevcServerMsg m %v", m)
return nil
}
// 连接成功 之后同步区服信息
func HandShake(a *Agent) {
m := &msg.Msg{
Type: msg.CLUSTER_HANDSHAKE_1,
From: conf.Server.ServerID,
Extra: conf.Server.RemoteAddr,
}
data, err := GoUtil.GobMarshal(m)
if err != nil {
log.Debug("HandShake GobMarshal err %v", err)
return
}
// log.Debug("握手 server id :%d", conf.Server.ServerID)
a.WriteMsg(data)
}
// 握手回调
func HandShakeRecv(a *Agent, m *msg.Msg) error {
ServerId := m.From
// log.Debug("收到握手回复 ServerId %v", ServerId)
a.ServerId = ServerId
serverAgent.Store(ServerId, a)
if conf.Server.ServerID == ClusterCenterId {
log.Debug("通知区服:%d加入网路", m.From)
SendMsgAll(&msg.Msg{
Type: msg.CLUSTER_JOIN,
From: conf.Server.ServerID,
Extra: &ClusterJoinData{
ServerId: m.From,
RemoteAddr: m.Extra.(string),
},
})
}
syncMsg := &msg.Msg{
Type: msg.CLUSTER_FRIEND_SYNC,
To: ServerId,
}
sendGameMsg(syncMsg)
// fmt.Print("现有区服连接:")
// serverAgent.Range(func(key, value interface{}) bool {
// fmt.Print(key)
// fmt.Print(",")
// return true
// })
// fmt.Println()
return nil
}
func HandShakeRecv2(a *Agent, m *msg.Msg) error {
ServerId := m.From
a.ServerId = ServerId
log.Debug("HandShakeRecv2 ServerId %v", ServerId)
serverAgent.Store(ServerId, a)
return nil
}
func ClusterJoin(a *Agent, m *msg.Msg) error {
clusterJoin := m.Extra.(*ClusterJoinData)
if conf.Server.ServerID == clusterJoin.ServerId {
log.Debug("区服加入通知为本服, 不处理")
return nil
}
log.Debug("ClusterJoin ServerId %v", clusterJoin.ServerId)
connectRemote(clusterJoin.RemoteAddr, clusterJoin.ServerId, "server")
return nil
}
func ClusterExit(a *Agent, m *msg.Msg) error {
clusterExit := m.Extra.(*ClusterExitData)
if conf.Server.ServerID == clusterExit.ServerId {
return nil
}
serverAgent.Delete(clusterExit.ServerId)
return nil
}
func connectRemote(RemoteAddr string, ConnType int, ConnLabel string) error {
client := new(network.TCPClient)
client.Addr = RemoteAddr
client.ConnNum = 1
client.PendingWriteNum = conf.PendingWriteNum
client.LenMsgLen = 4
client.MaxMsgLen = 4096
client.NewAgent = newAgent
client.ConnType = ConnType
client.ConnLabel = ConnLabel
client.ConnectInterval = time.Duration(time.Minute * 5)
if ConnType == ClusterCenterId { // 中心服断开重连
client.AutoReconnect = true
}
client.Start()
Center = client
clients = append(clients, client)
return nil
}
func SendServerMsg(m *msg.Msg, serverId int) error {
if v, ok := serverAgent.Load(serverId); ok {
data, err := GoUtil.GobMarshal(m)
if err != nil {
log.Debug("SendServerMsg GobMarshal err %v", err)
return err
}
v.(network.Agent).WriteMsg(data)
return nil
}
return fmt.Errorf("server %d not online", serverId)
}
func SendMsgAll(m *msg.Msg) {
data, err := GoUtil.GobMarshal(m)
if err != nil {
log.Debug("SendMsgAll GobMarshal err %v", err)
return
}
serverAgent.Range(func(key, value interface{}) bool {
value.(network.Agent).WriteMsg(data)
return true
})
}
func processMsg(a *Agent, m *msg.Msg) error {
var err error
if fun, ok := FuncMap[m.Type]; ok {
err = fun(a, m)
} else {
MsgChan <- m //交由game Module消息处理
}
return err
}
func registerFunc(key int, fun func(*Agent, *msg.Msg) error) {
FuncMap[key] = fun
}
func sendGameMsg(m *msg.Msg) {
MsgChan <- m
}