Skynet 通过组播(Multicast)实现一个简单的世界频道

 

什么是世界频道?

    "世界频道" 这个概念就是在一个游戏内经常见到。简单来说,世界频道就是在游戏内的一个大区中所有玩家可以接收、发布的消息的一个玩家间的统称。

    玩家在游戏中进行体验的同时,通常需要发布一些特殊的消息,包含:"买卖装备、组队等";通常游戏中的各种频道的实现都依赖于消息队列的广播方式。

 

Skynet的组播解决了什么问题?

    Skynet将消息通过指针进行传递到不同的服务之间,实现的简单的消息队列。当组播的消息较大时,可以节省内部网络的带宽。

 

 

下面直接上代码:

#Main:

local skynet = require "skynet"
local socket = require "socket"


skynet.start(function()
	local id = socket.listen("192.168.2.5",80)
	socket.start(id,function(fd,ipaddr)
		local network = skynet.newservice "network"
		skynet.send(network,"lua","Connection",fd,ipaddr)
		socket.abandon(fd)
	end)
	

end)

 

#network

local skynet = require "skynet"
local msg = require "multicast"
local socket = require "socket"


skynet.init(function()

	-- 注册世界聊天频道
	world_channel = skynet.uniqueservice "world_chat"
	msg_fd = msg.new {
		channel = skynet.call(world_channel,"lua","getMsgId"),
		dispatch = get_subscribeMsg,
	}

end)


local CMD = { }



function CMD.Connection(fd,ipaddr)
	CMD.fd,CMD.ipaddr = fd,ipaddr
	--print "订阅消息"
	msg_fd:subscribe()
	socket.start(fd)
	socket.write(fd,"welcome!\n\r>>")
	while fd do


		local buf = socket.readline(fd)

		if buf then

			msg_fd:publish(buf)
		else
			skynet.error("Client Closed this Connection...")

			break
		end

	end
	socket.close(fd)
	msg_fd:unsubscribe()
	skynet.exit()
end


function get_subscribeMsg(channel,session,msg)
	socket.write(CMD.fd,msg)
	socket.write(CMD.fd,"\r\n>>")
end


skynet.start(function()
	skynet.dispatch("lua",function(_,_,cmd,...)
		local f = assert(CMD[cmd],"找不到指定的处理函数...")
		if f then 
			f(...)
		end
	end)
end)

 

#world_chat

local skynet = require "skynet"
local msg = require "multicast"

local CMD = { }


skynet.init(function()
	print "初始化世界频道...."
	world_channel = msg.new()
end)


function CMD.getMsgId()
	skynet.ret(skynet.pack(world_channel.channel))	
end


skynet.start(function()
	skynet.dispatch("lua",function(_,_,cmd,...)
		local f = assert(CMD[cmd],"找不到指定的处理函数...")
		if f then 
			f(...)
		end
	end)
end)

 

    上述代码通过Skynet 的multicast实现了简单的世界聊天,在退出后关闭订阅。

    而上述代码也存在两个问题。至于是什么问题?这个就留给大家自己思考了。:)

 

转载于:https://my.oschina.net/CandyMi/blog/852202

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值