功能需求
如图所示,开启两个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服务发送一条消息,即打印日志 |
skynet.call的示意图
代码实现
标签:服务,第一个,ping1,cmd,程序,PingPong,消息,skynet,func From: https://www.cnblogs.com/zhaobangyu/p/17646191.html