目标
- 理解 Skynet
- 第一个程序 PingPong
内容
- Skynet 配置模板的各项说明
- PingPong的功能需求
- 代码实现
笔记
Skynet 配置项
Config 的配置
-- 必须配置
thread = 8 --启用多少个工作线程
cpath ="./cservice/?.so" --用C编写的服务模块的位置
bootstrap = "snlua bootstrap" --固定启动的第一个服务
-- bootstrap配置项
start ="main" -- 主服务入口
harbor = 0
-- lua配置项(暂时固定)
lualoader ="./lualib/loader.lua"
luaservice = "./service/?.lua;".."./test/?.lua;".."./examples/?.lua;".."./test/?/init.lua"
lua_path ="./lualib/?.lua;".."./lualib/?/init.lua"
lua_cpath="./luaclib/?.so"
-- 后台模式(必要时开启)
--daemon ="./skynet.pid"
-- logger ="./userlog"
第一个程序——PingPong的功能需求
开启两个 ping 类型的服务 ping1 和 ping2 , 让 ping1 给 ping2 发消息 ,ping2 收到后回应 ping1 , ping1 收到回应 ping2 ,不断循环。
代码实现
Pmain.lua
-- Pmain.Lua
local skynet = require "skynet"
skynet.start(function()
skynet.error("{Pmain} start")
local ping1 = skynet.newservice("ping") -- 启动一个ping类型的服务,返回服务的地址存在ping1里
local ping2 = skynet.newservice("ping")
skynet.send(ping1,"lua","start",ping2)-- 向地址ping1的服务发送一条名为“start”的lua类型消息,接收方用 skynet.dispatch 接收消息
skynet.exit()
end)
ping.lua
-- ping.lua
local skynet = require "skynet"
local CMD ={}
skynet.start(function() -- 用func函数初始化服务。编写服务时,都会写一句 skynet.start
skynet.dispatch("lua",function(session,source,cmd,...) --为lua类消息指定处理函数func;source代表发送方的服务地址;cmd代表消息名
local f =assert(CMD[cmd]) --收到其他服务的消息后,查找CMD[cmd]这个方法是否存在
f(source,...) --若存在则调用它
end)
end)
function CMD.start(source,target)
skynet.send(target,"lua","ping",1)
end
function CMD.ping(source,count)
local id = skynet.self()
skynet.error("["..id.."] recv ping count="..count)
skynet.sleep(100) -- 让协程暂停1s
skynet.send(source,"lua","ping",count+1)
end
运行结果