第一个程序PingPong
阅读原文时间:2023年08月21日阅读:1

功能需求

如图所示,开启两个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的示意图

代码实现

PingPong程序必须包含主服务和ping服务。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章