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做了什么工作
skynet skynet.send()、skynet.call()、skynet.ret()分析_第1张图片因为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 skynet.send()、skynet.call()、skynet.ret()分析_第2张图片
会发现有一个提示,看看提示在哪里出现的
skynet skynet.send()、skynet.call()、skynet.ret()分析_第3张图片提示你需要回应一个应答,正常来说 应该回一个skynet.ret()应答
skynet skynet.send()、skynet.call()、skynet.ret()分析_第4张图片回了之后sendmsg回跑到
skynet skynet.send()、skynet.call()、skynet.ret()分析_第5张图片
skynet skynet.send()、skynet.call()、skynet.ret()分析_第6张图片将参数传回来,然后回到
skynet skynet.send()、skynet.call()、skynet.ret()分析_第7张图片

你可能感兴趣的:(skynet框架分析)