博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Skynet 通过组播(Multicast)实现一个简单的世界频道
阅读量:6817 次
发布时间:2019-06-26

本文共 1964 字,大约阅读时间需要 6 分钟。

hot3.png

 

什么是世界频道?

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

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

 

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()endfunction get_subscribeMsg(channel,session,msg)	socket.write(CMD.fd,msg)	socket.write(CMD.fd,"\r\n>>")endskynet.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))	endskynet.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

你可能感兴趣的文章
C#中的MemberwiseClone和clone的区别
查看>>
python-列表常用功能介绍
查看>>
CSS概念 - 可视化格式模型(二) 定位概述(普通流、绝对定位)
查看>>
TSF自定义候选词列表界面
查看>>
C++链接库
查看>>
HTML5中的全局属性
查看>>
exp命令ORACLCE10G导出ORACLE11G的数据1455错误
查看>>
'<>' operator is not allowed for source level below 1.7
查看>>
hdu 油菜花王国
查看>>
[CQOI2016]伪光滑数
查看>>
使用jquery.validate.js实现boostrap3的校验和验证
查看>>
八百呼电话录音系统--让通讯管理更安心
查看>>
02-线性结构1 两个有序链表序列的合并
查看>>
Python+numpy(3).md
查看>>
Java基础学习总结(85)——Java中四种线程安全的单例模式实现方式
查看>>
Mysql学习总结(9)——MySql视图原理讲解与使用大全
查看>>
DirectX 10 学习笔记7:环境光
查看>>
Segmentation fault (core dumped)
查看>>
openCV 二 图像处理
查看>>
Android 使用 ACTION_CALL 拨号
查看>>