skynet skynet.send()、skynet.call()、skynet.ret()分析

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回跑到
在这里插入图片描述
在这里插入图片描述将参数传回来,然后回到
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值