mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-25 04:33:05 +00:00
add snax.gateserver snax.loginserver snax.msgserver
This commit is contained in:
130
lualib/snax/gateserver.lua
Normal file
130
lualib/snax/gateserver.lua
Normal file
@@ -0,0 +1,130 @@
|
||||
local skynet = require "skynet"
|
||||
local netpack = require "netpack"
|
||||
local socketdriver = require "socketdriver"
|
||||
|
||||
local gateserver = {}
|
||||
|
||||
local socket -- listen socket
|
||||
local queue -- message queue
|
||||
local maxclient -- max client
|
||||
local client_number = 0
|
||||
local CMD = setmetatable({}, { __gc = function() netpack.clear(queue) end })
|
||||
local nodelay = false
|
||||
|
||||
local connection = {}
|
||||
|
||||
function gateserver.openclient(fd)
|
||||
if connection[fd] then
|
||||
socketdriver.start(fd)
|
||||
end
|
||||
end
|
||||
|
||||
function gateserver.closeclient(fd)
|
||||
local c = connection[fd]
|
||||
if c then
|
||||
connection[fd] = false
|
||||
socketdriver.close(fd)
|
||||
end
|
||||
end
|
||||
|
||||
function gateserver.start(handler)
|
||||
assert(handler.message)
|
||||
assert(handler.connect)
|
||||
|
||||
function CMD.open( source, conf )
|
||||
assert(not socket)
|
||||
local address = conf.address or "0.0.0.0"
|
||||
local port = assert(conf.port)
|
||||
maxclient = conf.maxclient or 1024
|
||||
nodelay = conf.nodelay
|
||||
socket = socketdriver.listen(address, port)
|
||||
socketdriver.start(socket)
|
||||
if handler.open then
|
||||
return handler.open(source, conf)
|
||||
end
|
||||
end
|
||||
|
||||
function CMD.close()
|
||||
assert(socket)
|
||||
socketdriver.close(socket)
|
||||
socket = nil
|
||||
end
|
||||
|
||||
local MSG = {}
|
||||
|
||||
function MSG.data(fd, msg, sz)
|
||||
if connection[fd] then
|
||||
handler.message(fd, msg, sz)
|
||||
end
|
||||
end
|
||||
|
||||
function MSG.more()
|
||||
for fd, msg, sz in netpack.pop, queue do
|
||||
if connection[fd] then
|
||||
handler.message(fd, msg, sz)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MSG.open(fd, msg)
|
||||
if client_number >= maxclient then
|
||||
socketdriver.close(fd)
|
||||
return
|
||||
end
|
||||
if nodelay then
|
||||
socketdriver.nodelay(fd)
|
||||
end
|
||||
connection[fd] = true
|
||||
client_number = client_number + 1
|
||||
handler.connect(fd, msg)
|
||||
end
|
||||
|
||||
local function close_fd(fd)
|
||||
local c = connection[fd]
|
||||
if c ~= nil then
|
||||
connection[fd] = nil
|
||||
client_number = client_number - 1
|
||||
end
|
||||
end
|
||||
|
||||
function MSG.close(fd)
|
||||
if handler.disconnect then
|
||||
handler.disconnect(fd)
|
||||
end
|
||||
close_fd(fd)
|
||||
end
|
||||
|
||||
function MSG.error(fd, msg)
|
||||
if handler.error then
|
||||
handler.error(fd)
|
||||
end
|
||||
close_fd(fd)
|
||||
end
|
||||
|
||||
skynet.register_protocol {
|
||||
name = "socket",
|
||||
id = skynet.PTYPE_SOCKET, -- PTYPE_SOCKET = 6
|
||||
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.start(function()
|
||||
skynet.dispatch("lua", function (_, address, cmd, ...)
|
||||
local f = CMD[cmd]
|
||||
if f then
|
||||
skynet.ret(skynet.pack(f(address, ...)))
|
||||
else
|
||||
skynet.ret(skynet.pack(handler.command(cmd, address, ...)))
|
||||
end
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
return gateserver
|
||||
Reference in New Issue
Block a user