4dc77717
 
  zhouhaihai
 
压测
 | 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 
 | 
  require "ProtocolCode"
  require "shared.init"
  require "utils.init"
  skynet = require "skynet"
  local socketdriver = require "skynet.socketdriver"
  local netpack = require "skynet.netpack"
  local xxtea = require "xxtea"
  local httpc = require("http.httpc")
  local config = require "robot_config"
  
  local XXTEA_KEY = "699D448D6D24f7F941E9F6E99F823E18"
  
  local CMD = {}
  local client = {}
  local eventListener = {}
  
  local ignoreListener = {
  	["Role.updateProperty"] = function(data)
 
 | 
cbfd0513
 
  zhouhaihai
 
增加池子
 | 
19 
 | 
  		if not client.role then return end
 
 | 
4dc77717
 
  zhouhaihai
 
压测
 | 
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 
 | 
  		local msg = MsgPack.unpack(data)
  		for _, one in pairs(msg) do
  			client.role[one.key] = one.newValue
  		end
  	end,
  	["Role.updateProperties"] = function(data)
  		local msg = MsgPack.unpack(data)
  		for field, value in pairs(msg) do
  			client.role[field] = value
  		end
  	end,
  	["Role.notifyNewEvent"] = true,
  	["Role.chat"] = true,
  	["Role.updateItems"] = true,
  	["Gm.receiveResponse"] = true,
  	["Role.changeUpdate"] = true,
  	["Role.loadRunes"] = true,
  	["Hero.loadInfos"] = true,
 
 | 
7d31daa8
 
  zhouhaihai
 
调整压测
 | 
38
39
40 
 | 
  	["Store.updateproperty"] = true,
  	["Sys.maintainNotice"] = true,
  	["Hero.drawHeroExtraRewardNtf"] = true,
 
 | 
4dc77717
 
  zhouhaihai
 
压测
 | 
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 
 | 
  	["Sys.innerErrorMsg"] = function(data)
  		local msg = MsgPack.unpack(data)
  		log("innerErrorMsg: " .. msg.id)
  	end,
  }
  
  function addListener(actionCode, callback, isKeep)
  	callback = callback or function() end
  	local handlerName = actionHandlers[actionCode]
  	if string.sub(handlerName, -3, -1) == "Rpc" then
  		actionCode = actionCode + rpcResponseBegin
  	end
  	if eventListener[actionHandlers[actionCode]] then
  		log(handlerName .. " had listener")
  	end
  	local trueCall = callback
  	if not isKeep then
  		trueCall = function(data)
  			removeListener(actionCode)
  			callback(data)
  		end
  	end
  	eventListener[actionHandlers[actionCode]] = trueCall
  end
  
  function removeListener(actionCode)
  	local handlerName = actionHandlers[actionCode]
  	if string.sub(handlerName, -3, -1) == "Rpc" then
  		actionCode = actionCode + rpcResponseBegin
  	end
  	eventListener[actionHandlers[actionCode]] = nil
  end
  
  function triggerListener(listener, data)
  	if eventListener[listener] then
  		if #data > 0 then data = xxtea.decrypt(data, XXTEA_KEY) end
  		eventListener[listener](data)
  	elseif ignoreListener[listener] then
  		if type(ignoreListener[listener]) == "function" then
  			if #data > 0 then data = xxtea.decrypt(data, XXTEA_KEY) end
  			ignoreListener[listener](data)
  		end
  	else
 
 | 
cbfd0513
 
  zhouhaihai
 
增加池子
 | 
84 
 | 
  		-- log(listener .. " no handle!!!")
 
 | 
4dc77717
 
  zhouhaihai
 
压测
 | 
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 
 | 
  	end
  end
  
  function sendServer(actionCode, bin)
  	local session = 0
  	local handlerName = actionHandlers[actionCode]
  	if actionCode == actionCodes.Role_queryLoginRpc or string.sub(handlerName, -3, -1) ~= "Rpc" then
  		session = nil
  	end
  	
  	local data = string.pack("H", actionCode)
  	if session then
  		data = data .. string.pack("H", session)
  	end
  
  	if #bin > 0 then bin = xxtea.encrypt(bin, XXTEA_KEY) end
  	data = data .. bin
  
  	socketdriver.send(client.fd, netpack.pack(data))
  end
  
  function requestServer(actionCode, bin, callback, isKeep)
 
 | 
4dc77717
 
  zhouhaihai
 
压测
 | 
107 
 | 
  	addListener(actionCode, callback, isKeep)
 
 | 
1b6307bc
 
  zhouhaihai
 
监听再前
 | 
108 
 | 
  	sendServer(actionCode, bin)
 
 | 
4dc77717
 
  zhouhaihai
 
压测
 | 
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123 
 | 
  end
  
  local function heartBeat()
  	sendServer(actionCodes.Sys_heartBeat, "")
  	skynet.timeout(500, heartBeat)
  end
  
  local function startUnit(unit)
  	if unit == "login" then
  	else
  		unit = math.randWeight(config.units, "weight")
  	end
  
  	local ok, unitTest = pcall(require, "unitTest." .. unit)
  	if not ok then
 
 | 
a5fa0074
 
  zhouhaihai
 
robot
 | 
124 
 | 
  		log("unitTest load error : " .. unitTest)
 
 | 
4dc77717
 
  zhouhaihai
 
压测
 | 
125
126
127
128
129 
 | 
  	end
  
  	unitTest.new(client):startTest()
  end
  
 
 | 
4dc77717
 
  zhouhaihai
 
压测
 | 
130
131
132
133 
 | 
  
  -- 登录成功开始任务
  function CMD.task()
  	heartBeat()
 
 | 
d9c023b8
 
  zhouhaihai
 
压测
 | 
134
135 
 | 
  	-- 20 秒后开始执行任务 错开登录
  	skynet.sleep(math.randomInt(2000, 3000))
 
 | 
4dc77717
 
  zhouhaihai
 
压测
 | 
136
137
138
139
140
141
142
143
144
145
146
147 
 | 
  	startUnit()
  end
  
  -- 开始登录
  function CMD.start(fd, id)
  	client.fd = fd
  	client.clientId = id
  
  	local uname = config.uname_prefix .. id
  	client.uname = uname
  	local status, body = httpc.get(config.http, "/login?" .. httpGetFormatData({token = uname, device = "test", channel = "develop"}))
  	if tonumber(status) ~= 200 then
 
 | 
a5fa0074
 
  zhouhaihai
 
robot
 | 
148 
 | 
  		log("http get error", uname, body)
 
 | 
4dc77717
 
  zhouhaihai
 
压测
 | 
149
150
151
152
153
154
155
156
157
158 
 | 
  		return
  	end
  	local servInfo = json.decode(body)
  	client.uid = servInfo.userid
  	
  	startUnit("login")
  end
  
  -- 退出
  function CMD.exit()
 
 | 
7d31daa8
 
  zhouhaihai
 
调整压测
 | 
159
160
161 
 | 
  	sendServer(actionCodes.Gm_clientRequest,  MsgPack.pack({cmd = "gmmsg", pm1 = "123"}))
  	skynet.sleep(50)
  	skynet.ret(skynet.pack())
 
 | 
4dc77717
 
  zhouhaihai
 
压测
 | 
162
163
164
165
166
167
168
169
170
171
172
173
174
175 
 | 
  	skynet.exit()
  end
  
  skynet.register_protocol {
  	name = "client",
  	id = skynet.PTYPE_CLIENT,
  	unpack = function (msg, sz)
  		local data = skynet.tostring(msg, sz)
  		local cmd = string.unpack("H", string.sub(data, 1, 2))
  		return cmd, string.sub(data, 3)
  	end,
  	dispatch = function(session, address, cmd, data)
  		local actionName = actionHandlers[cmd]
  		if not actionName then
 
 | 
a5fa0074
 
  zhouhaihai
 
robot
 | 
176 
 | 
  			log("actionName not exist", actionName)
 
 | 
4dc77717
 
  zhouhaihai
 
压测
 | 
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194 
 | 
  			return
  		end
  
  		if cmd > rpcResponseBegin and actionName ~= "Role.queryLoginRpcResponse" then
  			-- 回复 有session
  			session = string.unpack("H", string.sub(data, 1, 2))
  			data = string.sub(data, 3)
  		end
  
  		triggerListener(actionName, data)
  	end,
  }
  
  skynet.start(function ()
  	skynet.dispatch("lua", function (_,_,cmd,...)
  		skynet.ret(skynet.pack(CMD[cmd](...)))
  	end)
  end)
 
 |