package main import ( "fmt" _ "net/http/pprof" "pro2d/cmd/gameserver/action" "pro2d/common" "pro2d/common/components" "pro2d/common/db" "pro2d/models" "pro2d/common/etcd" ) type GameServer struct { components.IServer EtcdClient *etcd.EtcdClient } func NewGameServer(sconf *common.SConf) (*GameServer, error) { s := &GameServer{} options := []components.ServerOption{ components.WithPlugin(components.NewPlugin(sconf.PluginPath)), components.WithSplitter(components.NewPBSplitter()), components.WithConnCbk(s.OnConnection), components.WithMsgCbk(s.OnMessage), components.WithCloseCbk(s.OnClose), components.WithTimerCbk(s.OnTimer), } iserver := components.NewServer(sconf.Port, options...) iserver.SetActions(action.GetActionMap()) s.IServer = iserver //mgo init err := db.ConnectMongo(sconf.MongoConf) if err != nil { return nil, err } models.InitModels() //Etcd 初始化 s.EtcdClient, err = etcd.NewEtcdClient(common.GlobalConf.Etcd) if err != nil { return nil, err } s.EtcdClient.PutWithLeasePrefix(common.GlobalConf.GameConf.Name, common.GlobalConf.GameConf.ID, fmt.Sprintf("%s:%d", common.GlobalConf.GameConf.IP, common.GlobalConf.GameConf.Port), 5) return s, nil } func (s *GameServer) Start() error { return s.IServer.Start() } func (s *GameServer) Stop() { s.IServer.Stop() db.CloseMongo() s.EtcdClient.Close() } func (s *GameServer) OnConnection(conn components.IConnection) { agent := NewAgent(s) agent.OnConnection(conn) s.GetConnManage().AddConn(conn.GetID(), agent) } func (s *GameServer) OnMessage(msg components.IMessage) { agent := s.GetConnManage().GetConn(msg.GetSession().GetID()) if agent == nil { return } agent.(*Agent).OnMessage(msg) } func (s *GameServer) OnTimer(conn components.IConnection) { agent := s.GetConnManage().GetConn(conn.GetID()) if agent == nil { return } agent.(*Agent).OnTimer() } func (s *GameServer) OnClose(conn components.IConnection) { agent := s.GetConnManage().GetConn(conn.GetID()) if agent == nil { return } agent.(*Agent).OnClose() s.GetConnManage().DelConn(conn.GetID()) }