变量在skynet lua服务之间的调用(5种方法)

变量在skynet lua服务之间的调用

查询到网上多种方法都有尝试

1. 利用require文件的方式

在要被引用的那个文件中,加入 table,将变量(函数)存在 table 中,return 该 table。如

*hall.lua* 
	local _ROOM = {}
	HALL_ADDRESS_ROOM = skynet.newservice("room")
	_ROOM.address = HALL_ADDRESS_ROOM
	--table.insert(_ROOM, HALL_ADDRESS_ROOM)
	return _ROOM

*agent.lua*
	local HALL_ROOM = require("hall")
	skynet.send(HALL_ROOM.address, "lua", name, args)
	--HALL_ROOM[1]

但结果是,在 agent.lua 中获得的 HALL_ROOM 为 nil,我又在网上查说这样只有函数才能用,函数我也尝试过,依旧是
nil,放弃!!

2. 给服务取别名

skynet.register(name)	--hall.lua中使用,取别名,全局最前面不带点(.name为非全局)
harbor.queryname(name)	--查询name别名服务的handle

由于我的程序要多次要多次创建某一服务且共存,所以不能用别名,放弃!!

3. 和第一种类似,这里我将 table 放在了第三个 lua 文件中,他们同时去require该文件

agent.lua得到的

结果一样,在 agent.lua 中的为 nil

4. 利用source(源),在服务之间通信时直接发送handle

skynet.self()		--获取当前服务的handle

*hall.lua* 
	local CMD = {}		--存指令
	HALL_ADDRESS_ROOM = skynet.newservice("room")
	local address_source
	function CMD.args_source(source)
		address_source = source
	end
	skynet.send(address_source, "lua", "agent_address_room", HALL_ADDRESS_ROOM)

*agent.lua*
	local CMD = {}
	local address_room
	skynet.send(skynet.uniqueservice("hall"), "lua", "args_source", skynet.self()))
	function CMD.agent_address_room(address)
		address_room = address
	end
	skynet.send(address_room, "lua", name, args)

结果和前面一样,都是nil,放弃!!

5. 结合上面的方法,我想,既然是相互通信,那我为什么不用skynet.call()和skynet.retpack()试一下呢

*hall.lua* 
local CMD = {}
function CMD.match()
	ROOM_ADDRESS = skynet.newservice("room")
    skynet.retpack(ROOM_ADDRESS)		--打包回应skynet.call()
    skynet.send(ROOM_ADDRESS, "lua", name, args)
end

*agent.lua*
	address = skynet.call(hall, "lua", "match")
	skynet.send(address, "lua", name, args)

BINGO!!!成功,skynet.call()本身需要对方的回应,刚好可以用在这里将handle(即address)传回

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值