变量在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 中的为 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)传回