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)
endfunction CMD.load(list)for i, name in ipairs(list) dolocal p = load(name)skynet.error(string.format("load proto [%s] in slot %d", name, i))data[name] = isprotoloader.save(p, i)end
endfunction CMD.index(name)return data[name]
endskynet.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
加载到框架中。