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