skynet demo 项目地址(plain text分支 )
-- protoloader.lua
local skynet = require "skynet"
local sprotoparser = require "sprotoparser"
local sprotoloader = require "sprotoloader"
local data = {}
local CMD = {}
local function load(name)
local filename = string.format("proto/%s", name)
local f = assert(io.open(filename), "Can't open " .. name)
local t = f:read "a"
f:close()
return sprotoparser.parse(t)
end
function CMD.load(list)
for i, name in ipairs(list) do
local p = load(name)
skynet.error(string.format("load proto [%s] in slot %d", name, i))
data[name] = i
sprotoloader.save(p, i)
end
end
function CMD.index(name)
return data[name]
end
skynet.start(function()
skynet.dispatch("lua", function(session, source, cmd, ...)
local f = assert(CMD[cmd])
skynet.ret(skynet.pack(f(...)))
end)
end)
通讯协议需要从文件中读取协议的定义信息,然后通过sprotoparser
解析成二进制流才能交给sprotoloader
加载到skynet
框架使用。
编写protoloader.lua
服务的目的在于方便使用,你也可以直接在main.lua
读取.sproto
文件并交由sprotoparser
解析,然后通过sprotoloader
加载到框架中。