112 lines
2.2 KiB
Go
112 lines
2.2 KiB
Go
package mergeCluster
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"server/GoUtil"
|
|
"server/conf"
|
|
"server/game/mod/msg"
|
|
"server/pkg/github.com/name5566/leaf/log"
|
|
"server/pkg/github.com/name5566/leaf/network"
|
|
"sync"
|
|
)
|
|
|
|
const (
|
|
ClusterCenterId = 0 // 集群中心
|
|
)
|
|
|
|
var FuncMap = map[int]func(*Agent, *msg.Msg) error{} // 消息处理函数
|
|
|
|
var (
|
|
server *network.TCPServer // 服务器
|
|
Center *network.TCPClient // 集群中心
|
|
clients []*network.TCPClient // 集群客户端
|
|
MsgChan = make(chan *msg.Msg, 1000) // 消息队列
|
|
serverAgent sync.Map // 服务器Agent
|
|
)
|
|
|
|
func Init() {
|
|
if conf.Server.ListenAddr != "" {
|
|
server = new(network.TCPServer)
|
|
server.Addr = conf.Server.ListenAddr
|
|
server.MaxConnNum = int(math.MaxInt32)
|
|
server.PendingWriteNum = conf.PendingWriteNum
|
|
server.LenMsgLen = 4
|
|
server.MaxMsgLen = 4096
|
|
server.NewAgent = newServerAgent
|
|
server.Start()
|
|
}
|
|
|
|
if conf.Server.CenterAddr != "" {
|
|
connectRemote(conf.Server.CenterAddr, ClusterCenterId, "center")
|
|
}
|
|
|
|
registerFunc(msg.CLUSTER_HANDSHAKE_1, HandShakeRecv)
|
|
registerFunc(msg.CLUSTER_HANDSHAKE_2, HandShakeRecv2)
|
|
registerFunc(msg.CLUSTER_JOIN, ClusterJoin)
|
|
registerFunc(msg.CLUSTER_EXIT, ClusterExit)
|
|
}
|
|
|
|
func Destroy() {
|
|
if server != nil {
|
|
log.Release("closing cluster server")
|
|
server.Close()
|
|
}
|
|
|
|
for _, client := range clients {
|
|
client.Close()
|
|
}
|
|
}
|
|
|
|
type Agent struct {
|
|
conn *network.TCPConn
|
|
ServerId int
|
|
Type int
|
|
}
|
|
|
|
func newAgent(conn *network.TCPConn) network.Agent {
|
|
a := new(Agent)
|
|
a.conn = conn
|
|
return a
|
|
}
|
|
|
|
func newServerAgent(conn *network.TCPConn) network.Agent {
|
|
a := new(Agent)
|
|
a.conn = conn
|
|
a.Type = 1
|
|
return a
|
|
}
|
|
|
|
func (a *Agent) Run() {
|
|
HandShake(a)
|
|
for {
|
|
data, err := a.conn.ReadMsg()
|
|
if err != nil {
|
|
log.Debug("read message error: %v", err)
|
|
break
|
|
}
|
|
m := msg.Msg{}
|
|
err = GoUtil.GobUnmarshal(data, &m)
|
|
if err != nil {
|
|
log.Debug("decode err: %v", err)
|
|
return
|
|
}
|
|
err = processMsg(a, &m)
|
|
if err != nil {
|
|
log.Debug("ProcessMsg err: %v", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (a *Agent) WriteMsg(data interface{}) {
|
|
err := a.conn.WriteMsg(data.([]byte))
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
}
|
|
|
|
func (a *Agent) OnClose() {
|
|
log.Debug("server %d close", a.ServerId)
|
|
serverAgent.Delete(a.ServerId)
|
|
}
|