平台开发——skynet——③内部服务间通信

int skynet_send(
  struct skynet_context * context,   //
  uint32_t source,                   //可不填,默认为自己
  uint32_t destination,              //发送的目的地址
  int type,                          //消息类型
  int session,						 //
  void * msg,   					 //发送的消息的地址
  size_t sz							 //发送的消息的长度
);

内部服务间通信:
无需响应:skynet.send()
需要响应:skynet.call()
目的地址的接收:skynet.dispatch()

①消息打包与解包

local msg, sz = skynet.pack("zhoudongyu", 24, false) 
local arg1, arg2, arg3 = skynet.unpack(msg, sz)

其中
msg——消息指针地址
sz——消息长度”
“zhoudongyu”, 24, false——都是打算要发送的消息

②向某个服务发送一个消息(无需响应的消息)

发送端:

skynet.send(addr, type, ...)           //...代表要发送的消息(send函数会自动帮你打包)
skynet.rawsend(addr, type, msg, sz)    //msg,sz就是打包好的消息

接收端:

skynet.dispatch("lua", function(session, address, ...)
          func1(session, address, ...)
end)

实例:
——发送端 testsendmsg.lua

skynet = require "skynet"
​
skynet.start(function()
    skynet.register(".testsendmsg")      --取别名
    local testluamsg = skynet.localname(".testluamsg")
    --发送lua类型的消息给testluamsg,发送成功后立即返回,r的值为0
    local r = skynet.send(testluamsg, "lua", "zhoudongyu", 24, false)
    skynet.error("skynet.send return value:", r)    
end)

——接收端

skynet = require "skynet"
require "skynet.manager"
​
local function func1(session, address, ...)
    skynet.error("session", session)
    skynet.error("address", skynet.address(address))
    local args = {...}       -- ...就是接受到的消息
    for i,v in pairs(args) do
         skynet.error("arg"..i..":", v)
    end
end

skynet.start(function()
    skynet.dispatch("lua", function(session, address, ...)
          func1(session, address, ...)   		--func1就是自定义的消息处理函数
    end)
    skynet.register(".testluamsg")
end)

③向某个服务发送一个消息(必须响应的消息)

发送端:

skynet.call(addr, type, ...)    --发送时自动对消息打包,自动对返回的消息解包
skynet.rawcall(addr, type, msg, sz) 

接收端:

skynet.ret --目标服务消息处理后需要通过该函数将结果返回
skynet.retpack(...) --将消息用skynet.pack 打包,并调用 ret 回应。

实例:
——发送端 testcallmsg.lua

skynet = require "skynet"
skynet.start(function()
    skynet.register(".testcallmsg")
    --发送lua类型的消息给service,发送成功,该函数将阻塞等待响应返回,r的值为响应的返回值
    local r = skynet.call(".testluamsg", "lua", 1, "nengzhong", true)
    skynet.error("skynet.call return value:", r)
end)

——接收端 testluamsg.lua

skynet = require "skynet"
require "skynet.manager"
​
local function dosomething(session, address, ...)
    skynet.error("session", session)
    skynet.error("address", skynet.address(address))
    local args = {...}
    for i,v in pairs(args) do
         skynet.error("arg"..i..":", v)
    end
    return 100
end

skynet.start(function()
    skynet.dispatch("lua", function(session, address, ...)
          skynet.retpack(dosomething(session, address, ...)) --返回响应
    end)
    skynet.register(".testluamsg")
end)

本文参考:
https://blog.codingnow.com/2012/09/the_design_of_skynet.html
https://blog.csdn.net/qq769651718/article/details/79432897

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值