start.lua
3.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
require("utils.StringUtil")
require("utils.TableUtil")
require "utils.MathUtil"
local config = require "robot_config"
local skynet = require "skynet"
local netpack = require "skynet.netpack"
local socketdriver = require "skynet.socketdriver"
local deque = require "deque"
local string_format = string.format
local poold, pooldObj, onlineCount, startId, endId, inpre
local factory
local queue = {}
local fd2serv = {}
local id2fd = {}
local MSG = {}
local id_max 
function MSG.open( ... )
	log("open", ...)
end
function MSG.close(fd)
	if fd2serv[fd] and not fd2serv[fd].closing then
		fd2serv[fd].closing = true
		skynet.call(fd2serv[fd].agent, "lua", "exit")
		pcall(skynet.send, poold, "lua", "feed")
		log(string_format("logout %s", fd2serv[fd].id))
		id2fd[fd2serv[fd].id] = nil
		fd2serv[fd] = nil
	end
end
function MSG.error(fd, msg)
	log("MSG.error", fd, msg)
	MSG.close(fd)
end
function MSG.data(fd, msg, sz)
	if fd2serv[fd] then
		skynet.redirect(fd2serv[fd].agent, 0, "client", 0, msg, sz)
	end
end
local function dispatch_queue()
	local fd, msg, sz = netpack.pop(queue)
	if fd then
		skynet.fork(dispatch_queue)
		MSG.data(fd, msg, sz)
		for fd, msg, sz in netpack.pop, queue do
			MSG.data(fd, msg, sz)
		end
	end
end
MSG.more = dispatch_queue
skynet.register_protocol {
	name = "socket",
	id = skynet.PTYPE_SOCKET,
	unpack = function (msg, sz)
		return netpack.filter(queue, msg, sz)
	end,
	dispatch = function (_, _, q, type, ...)
		queue = q
		if type then
			MSG[type](...)
		end
	end
}
skynet.register_protocol {
	name = "client",
	id = skynet.PTYPE_CLIENT,
}
local function add_robot()
	local time = skynet.time()
	local robot = factory:pop()
	local fd = socketdriver.connect(config.host, config.port)
	socketdriver.start(fd)
	local id
	if id_max >= endId then
		while true do
			id = math.randomInt(startId, endId)
			if not id2fd[id] then
				break
			end
		end
	else
		id_max = id_max + 1
		id = id_max
	end
	fd2serv[fd] = {agent = robot, id = id}
	id2fd[id] = fd
	pcall(skynet.call, robot, "lua", "start", fd, id, prefix)
	log(string_format("login %s", fd2serv[fd].id))
	-- 定时下线
	skynet.timeout(math.randomInt(config.online_time[1], config.online_time[2]) * 100, function()
		MSG.close(fd)
		socketdriver.close(fd)
	end)
end
local function online()
	local curCount = 0
	for _, _ in pairs(fd2serv) do
		curCount = curCount + 1
	end
	-- 及时补充人数
	if curCount < onlineCount then
		for i = curCount + 1, onlineCount do
			add_robot()
		end
	end
	-- log(string_format("online  %s", curCount))
	skynet.timeout(100, online)
end
local function start(pooldp, pooldObj, onlineCountp, startIdp, endIdp, inprep)
	log("start testing ...")
	factory = deque.clone(pooldObj)
	poold, onlineCount, startId, endId, inpre = pooldp, onlineCountp, startIdp, endIdp, inprep
	id_max = startId - 1
	for i = 1, onlineCount, inpre do
		for j = 1, inpre do
			if i + j - 1 > onlineCount then
				break
			end
			add_robot()
		end
		skynet.sleep(100)
	end
	-- 每秒检查补充在线人数
	online()
end
skynet.start(function()
	skynet.dispatch("lua", function (_, _, command, ...)
		if command == "start" then
			start(...)
			return
		end
	end)
end)