如图所示,开启两个ping类型的服务ping1和ping2,ping1给ping2发消息,ping2收到回应ping1,ping1收到再回应ping2,不断循环。
Skynet提供了开启服务发送消息的API,必先掌握它们。表2-5列出了Skynet中8个最重要的API,PingPong程序会用到它们。更多API可以参见 Skynet API
Lua API
说明
newservice(name,…)
启动一个名(类型)为name的新服务,并返回新服务的地址,地址格式为:0100000f、01000009即表示服务地址,同节点内的服务会有唯一地址,例如
local ping1 = skynet.newservice("ping")
表示开启一个ping类型的服务,把地址存放到ping1中
start(func)
用func函数初始化服务。编写服务时,都会写一名skynet.start,并在func写一些初始化代码
dispatch(type,func)
为type类型的消息设定处理函数fun。Skynet支持多种消息类型,由于Lua服务间的消息类型是“lua”,因此这里暂时将它固定为“lua”。func是指收到消息的处理函数,当一个服务收到新消息时,Skynet就会开启新协程,并调用它。func的形式为
function(session, source, cmd,…)
……
end
参数 session 代表消息的唯一id,source代表消息来源,指发送消息的服务地址,cmd代表消息号,"…"是一个可变参数,内容由发送方的skynet.send 或 skynet.call 指定
编写服务,一般会用如下的固定形式。表示以匿名函数的方式编写 skynet.start的参数func,并在func中调用dispatch
skynet.start(function()
skynet.dispatch("lua",function(参数略)
……
end)
end)
send(addr,type,cmd,…)
向地址为addr的服务发送一条type类型的消息,消息名为cmd。发送方用skynet.send发送消息,接收文用skynet.dispatch接收消息,它们的参数相互对应。若用于服务间通信,类型一般固定为"lua" 例如,使用如下语句向服务 ping1 发送消息
skynet.send(ping1, "lua", "ping", 1, 2)
在ping1的dispatch回调中,参数的值如下
function(session, source, cmd, p1, p2, p3)
-- cmd = "ping"
-- p1 = 1
-- p2 = 2
-- p3 = nil
end
call(addr,type,cmd,…)
向地址为addr的服务发送一条type类型的消息,并等待对方的回应。skynet.call是个阻塞方法
exit()
结束当前服务
self()
返回当前服务的地址
error(msg)
向log服务发送一条消息,即打印日志
PingPong程序必须包含主服务和ping服务。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章