skynet.send(addr,type,...) //addr 可以是服务句柄也可以是别名 type消息类型 ... 参数 非阻塞 不需要应答
skynet.call(addr,type,...) //阻塞 需要应答
skynet.ret(msg,sz) //回应消息
首先上示例代码
receivemsg.lua --接收消息端
local skynet = require("skynet")
require("skynet.manager")
function dosomething(session,address,...)
skynet.error("recv from:",skynet.address(address),"session:",session)
local args = {...}
-- skynet.error("name:",args[1],"age:",args[2])
end
skynet.start(function ( ... )
skynet.register(".receivemsg")
skynet.dispatch("lua",function ( session,address,... )
local ret = dosomething(session,address,...)
local msg,sz = skynet.pack(...)
skynet.ret(msg,sz) --回应
end)
end)
接收端接收消息并发送了一个应答包
sendmsg.lua --发送端代码
local skynet = require("skynet")
require("skynet.manager")
skynet.start(function ( ... )
local receivemsg = skynet.localname(".receivemsg")
local r = skynet.send(receivemsg,"lua","lpl",18) --发送完消息立马返回
-- print("size:",skynet.pack("lua","lpl",18))
-- skynet.error("skynet send return value:",r)
end)
而发送端发出了一个不需要应答的包,看看什么效果
结果如下
但是接收端还有一个skynet.ret() 看看ret做了什么工作
因为sendmsg发送了一个不需要应答的包,所以co_session 为0 ,然后就释放msg
当接收端不回应答,而发送端需要应答的时候,会出现什么情况呢,一起实验一下
receivemsg.lua
local skynet = require("skynet")
require("skynet.manager")
function dosomething(session,address,...)
skynet.error("recv from:",skynet.address(address),"session:",session)
local args = {...}
-- skynet.error("name:",args[1],"age:",args[2])
end
skynet.start(function ( ... )
skynet.register(".receivemsg")
skynet.dispatch("lua",function ( session,address,... )
local ret = dosomething(session,address,...)
--不回应
-- local msg,sz = skynet.pack(...)
-- skynet.ret(msg,sz) --回应
-- skynet.error("ret:",NORET,ret)
end)
end)
sendmsg.lua
local skynet = require("skynet")
require("skynet.manager")
skynet.start(function ( ... )
local receivemsg = skynet.localname(".receivemsg")
name,age = skynet.call(".receivemsg","lua","lpl",18)
skynet.error("skynet.call return value:",name,age)
end)
结果如下:
会发现有一个提示,看看提示在哪里出现的
提示你需要回应一个应答,正常来说 应该回一个skynet.ret()应答
回了之后sendmsg回跑到
将参数传回来,然后回到