start.lua
2.63 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
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 string_format = string.format
local queue = {}
local fd2serv = {}
local id2fd = {}
local MSG = {}
local id_max = 0 -- robot id
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")
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 robot = skynet.newservice("robot")
local fd = socketdriver.connect(config.host, config.port)
socketdriver.start(fd)
local id
if id_max >= config.max then
while true do
id = math.randomInt(1, config.max)
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)
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 < config.online then
for i = curCount + 1, config.online do
add_robot()
end
end
-- log(string_format("online %s", curCount))
skynet.timeout(100, online)
end
local function start()
log("start testing ...")
for i = 1, config.online, config.inpre do
for j = 1, config.inpre do
add_robot()
end
skynet.sleep(100)
end
-- 每秒检查补充在线人数
online()
end
skynet.start(function()
skynet.fork(start)
end)