Skynet提供了开启服务和发送消息的API,必须要先掌握它们。列出了Skynet中8个最重要的API,PingPong程序会用到它们。
Lua API | 说明 |
newservice(name, ...) | 启动一个名为 name 的新服务,并返回服务的地址。 |
start(func) | 用 func 函数初始化服务,并将消息处理函数注册到 C 层,让该服务可以工作。 |
dispatch(type, func) | 为 type 类型的消息设定一个处理函数。Skynet支持多种消息类型,由于Lua服务间的消息类型是“lua”,因此这里暂时将它定为“lua”。func是指收到消息后的处理函数,当一个服务收到消息时,skynet就会开启新协程,并调用它。 |
send(addr, type, ...) | 用 type 类型向 addr 发送一个消息,消息名为cmd。发送方用skynet.send发送消息,接收方用skynet.dispatch接受消息,它们的参数相互对应。若用于服务间通信,类型一般固定为“lua” |
call(addr, type, ...) | 用 type 类型发送一个消息到 addr ,并等待对方的回应。skynet.call是个阻塞方法。 |
exit() | 结束当前服务。 |
self() | 返回当前服务的地址。 |
error(msg) | 打印日志,向 log 服务发送一条消息。 |
更多API可以参见:https://github.com/cloudwu/skynet/wiki/APIList
初看API文档可能一头雾水,结合下面的实例开发才能融会贯通。
按如下图所示,开启两个ping类型的服务ping1和ping2,让ping1给ping2发消息,ping2收到
后回应ping1,ping1收到再回应ping2,不断循环。
在skynet/examples目录下新建main_ping.lua文件,输入如下所示代码:
local skynet = require "skynet"
skynet.start(function()
skynet.error("[PingMain] start")
local ping1 = skynet.newservice("Ping")
local ping2 = skynet.newservice("Ping")
skynet.send(ping1, "lua", "start", ping2)
skynet.exit()
end)
在skynet/examples目录下新建ping.lua文件,输入如下所示代码:
local skynet = require "skynet"
local CMD = {}
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)
skynet.send(source, "lua", "ping", count+1)
end
skynet.start(function()
skynet.dispatch("lua", function(session, source, cmd, ...)
local f = assert(CMD[cmd])
f(source,...)
end)
end)
include "config.path"
thread = 8
logger = nil
logpath = "."
harbor = 0
start = "main_ping" -- main script
bootstrap = "snlua bootstrap" -- The service for bootstrap
-- snax_interface_g = "snax_g"
cpath = root.."cservice/?.so"
-- daemon = "./skynet.pid"
最后打开终端,输入如下指令,显示运行结果。