Blame view

cmd/gameserver/agent.go 3.13 KB
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
1
2
3
  package main
  
  import (
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
4
5
  	"github.com/golang/protobuf/proto"
  	"math"
8d983031   zhangqijia   loginReq uid -> t...
6
  	"pro2d/cmd/gameserver/action"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
7
8
  	"pro2d/common"
  	"pro2d/common/components"
765431a4   zhangqijia   增加schema接口, 抽象 mo...
9
  	"pro2d/common/logger"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
10
  	"pro2d/models"
8d983031   zhangqijia   loginReq uid -> t...
11
  	"pro2d/pb"
58e37bfe   zhangqijia   add sync.Pool to ...
12
  	"sync"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
13
14
15
16
17
18
19
20
  	"sync/atomic"
  )
  
  type Agent struct {
  	components.IConnection
  	Server components.IServer
  
  	Role			*models.RoleModel
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
21
22
23
24
25
  	nextCheckTime   	int64 //下一次检查的时间
  	lastHeartCheckTime 	int64
  	heartTimeoutCount  	int   //超时次数
  }
  
58e37bfe   zhangqijia   add sync.Pool to ...
26
  var agentPool = sync.Pool{New: func() interface{} { return new(Agent)}}
9a9d092e   zhangqijia   每条连接增加一个定时器,每条连接增...
27
  
58e37bfe   zhangqijia   add sync.Pool to ...
28
29
30
  func NewAgent(s components.IServer) *Agent {
  	a := agentPool.Get().(*Agent)
  	a.Server = s
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
31
  
58e37bfe   zhangqijia   add sync.Pool to ...
32
  	a.nextCheckTime =      0
29a163be   zhangqijia   fix: CreateReq ui...
33
  	a.lastHeartCheckTime = common.Timex()
58e37bfe   zhangqijia   add sync.Pool to ...
34
35
  	a.heartTimeoutCount=  0
  	return a
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
36
37
  }
  
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
38
39
  func (c *Agent) OnConnection(conn components.IConnection)  {
  	c.IConnection = conn
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
40
41
  }
  
8d983031   zhangqijia   loginReq uid -> t...
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
  func (c *Agent) OnLogin(msg components.IMessage)  {
  	//第一次登录
  	errCode, irole := action.LoginRpc(msg)
  	if errCode != 0 {
  		c.Send(errCode, msg.GetHeader().GetMsgID(), nil)
  		return
  	}
  
  	role := irole.(*models.RoleModel)
  	protoMsg := &pb.RoleRsp{
  		Role:   role.Role,
  		Hero:   role.GetAllHero(),
  		Team:   role.GetAllTeam(),
  	}
  	rsp, err := proto.Marshal(protoMsg)
  	if err != nil {
  		c.Send(-100, msg.GetHeader().GetMsgID(), nil)
  		return
  	}
  	c.Send(errCode, msg.GetHeader().GetMsgID(), rsp)
  	//登录成功,存储agent role
  	c.Role = role
  }
  
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
66
  func (c *Agent) OnMessage(msg components.IMessage)  {
29a163be   zhangqijia   fix: CreateReq ui...
67
  	atomic.StoreInt64(&c.lastHeartCheckTime, common.Timex())
8d983031   zhangqijia   loginReq uid -> t...
68
69
70
71
72
73
  
  	if msg.GetHeader().GetMsgID() == uint32(pb.ProtoCode_LoginReq) {
  		c.OnLogin(msg)
  		return
  	}
  
765431a4   zhangqijia   增加schema接口, 抽象 mo...
74
  	md := c.Server.GetAction(msg.GetHeader().GetMsgID())
77f5eec7   zhangqijia   plugin 插件热更 接口
75
  	if md == nil {
58e37bfe   zhangqijia   add sync.Pool to ...
76
  		logger.Debug("cmd: %d, handler is nil", msg.GetHeader().GetMsgID())
77f5eec7   zhangqijia   plugin 插件热更 接口
77
78
  		return
  	}
58e37bfe   zhangqijia   add sync.Pool to ...
79
80
  	logger.Debug("protocolID: %d", msg.GetHeader().GetMsgID())
  	//fmt.Printf("errCode: %d, protoMsg:%v\n", errCode, protoMsg)
77f5eec7   zhangqijia   plugin 插件热更 接口
81
  
765431a4   zhangqijia   增加schema接口, 抽象 mo...
82
  	f := md.(func (msg components.IMessage)  (int32, interface{}))
58e37bfe   zhangqijia   add sync.Pool to ...
83
  	errCode, protoMsg := f(msg)
8d983031   zhangqijia   loginReq uid -> t...
84
  
58e37bfe   zhangqijia   add sync.Pool to ...
85
  	if protoMsg == nil {
8d983031   zhangqijia   loginReq uid -> t...
86
  		c.Send(errCode, msg.GetHeader().GetMsgID(), nil)
58e37bfe   zhangqijia   add sync.Pool to ...
87
88
89
90
  		return
  	}
  
  	rsp, err := proto.Marshal(protoMsg.(proto.Message))
77f5eec7   zhangqijia   plugin 插件热更 接口
91
  	if err != nil {
8d983031   zhangqijia   loginReq uid -> t...
92
  		c.Send(-100, msg.GetHeader().GetMsgID(), nil)
58e37bfe   zhangqijia   add sync.Pool to ...
93
  		return
77f5eec7   zhangqijia   plugin 插件热更 接口
94
  	}
8d983031   zhangqijia   loginReq uid -> t...
95
  	c.Send(errCode, msg.GetHeader().GetMsgID(), rsp)
9a9d092e   zhangqijia   每条连接增加一个定时器,每条连接增...
96
97
98
99
  }
  
  func (c *Agent) OnTimer()  {
  	nextCheckTime := atomic.LoadInt64(&c.nextCheckTime)
29a163be   zhangqijia   fix: CreateReq ui...
100
  	now := common.Timex()
9a9d092e   zhangqijia   每条连接增加一个定时器,每条连接增...
101
102
103
104
105
106
107
108
109
110
  	if now >= nextCheckTime {
  		//检查心跳
  		c.checkHeartBeat(now)
  		nextCheckTime = now + common.HeartTimerInterval
  		atomic.StoreInt64(&c.nextCheckTime, nextCheckTime)
  	}
  
  	if c.Role != nil {
  		//role 恢复数据
  		c.Role.OnRecoverTimer(now)
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
111
  	}
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
112
113
114
  }
  
  func (c *Agent) OnClose()  {
9a9d092e   zhangqijia   每条连接增加一个定时器,每条连接增...
115
  	c.Close()
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
116
117
118
  }
  
  func (c *Agent) Close()  {
8d983031   zhangqijia   loginReq uid -> t...
119
  	c.Role = nil
58e37bfe   zhangqijia   add sync.Pool to ...
120
121
  	agentPool.Put(c)
  
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
122
123
124
125
126
127
128
129
130
  	if c.Role == nil {
  		return
  	}
  
  	c.Role.OnOfflineEvent()
  }
  
  func (c *Agent) checkHeartBeat(now int64)  {
  	lastHeartCheckTime := atomic.LoadInt64(&c.lastHeartCheckTime)
58e37bfe   zhangqijia   add sync.Pool to ...
131
  	//logger.Debug("checkHeartBeat ID: %d, last: %d, now: %d", c.GetID(), lastHeartCheckTime, now)
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
132
133
134
135
136
137
138
139
140
141
142
  	if math.Abs(float64(lastHeartCheckTime - now)) > common.HeartTimerInterval {
  		c.heartTimeoutCount++
  		if c.heartTimeoutCount >= common.HeartTimeoutCountMax {
  			c.Stop()
  			return
  		}
  		logger.Debug("timeout count: %d", c.heartTimeoutCount)
  	}else {
  		c.heartTimeoutCount = 0
  	}
  }