Skynet 通过组播(Multicast)实现一个简单的世界频道
2019独角兽企业重金招聘Python工程师标准>>>
什么是世界频道?
"世界频道" 这个概念就是在一个游戏内经常见到。简单来说,世界频道就是在游戏内的一个大区中所有玩家可以接收、发布的消息的一个玩家间的统称。
玩家在游戏中进行体验的同时,通常需要发布一些特殊的消息,包含:"买卖装备、组队等";通常游戏中的各种频道的实现都依赖于消息队列的广播方式。
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 dolocal buf = socket.readline(fd)if buf thenmsg_fd:publish(buf)elseskynet.error("Client Closed this Connection...")breakendendsocket.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(...)endend)
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(...)endend)
end)
上述代码通过Skynet 的multicast实现了简单的世界聊天,在退出后关闭订阅。
而上述代码也存在两个问题。至于是什么问题?这个就留给大家自己思考了。:)
转载于:https://my.oschina.net/CandyMi/blog/852202
Skynet 通过组播(Multicast)实现一个简单的世界频道相关推荐
- 网络层:单播unicast 组播multicast 广播broadcast
当前的网络中有三种通讯模式:单播.广播.组播(多播),其中的组播出现时间最晚但同时具备单播和广播的优点,最具有发展前景. 一.单播unicast: 主机之间"一对一"的通讯模式,网 ...
- 分布式系统(四) 组播 Multicast
Multicast 组播 通信模式 Unicast 一个进程向另一个进程发送消息 尽力而为:如果信息传送,就没有被破坏 可靠的:保证信息能传送 有序:信息传送(deliver)的顺序与发送的顺序一致 ...
- java单播多播socket_广播(broadcast),组播(multicast),单播(unicast)的Java实现
## IP地址 在IPv4中,一共有五类IP地址 * A类地址:网络号占1个字节.网络号的第一位固定为0. * B类地址:网络号占2个字节.网络号的前两位固定为10. * C类地址:网络号占3个字节. ...
- 关于图片轮播图的一个简单实例 以及实例中发现问题
1.最近在学习JS的过程中,为了巩固水平做了一个简单的轮播图,以及在做的过程中发现一些问题(未解决!希望可以有大佬可以解释这个问题) 2.代码如下: <!DOCTYPE html> < ...
- UDP单播 组播 广播 区别及简单实现
无论是tcp还是udp 服务器都必须绑定prot.Ip,客户端可以有选择性. udp单播: 单播只能是发送方往接收方指定的IP 端口发送数据 组播需具备的条件 1.接收方设置组播属性及组播号 2. ...
- python编程简单案例_[五组数据]详解一个简单的卡尔曼滤波器python编程实例
上半年毕设的时候接触了卡尔曼滤波器,用matlab实现了该过程,尝试在一个课后作业中用三维度矩阵来存储变量的方式,结构似乎更好理解,记录一下分析的过程. 假如有一块电阻,你不知道它的阻值是多少,你想 ...
- Upd通信之QUdpSocket的unicast单播、broadcast广播、multicast组播
简 述: 了解Upd通信之QUdpSocket的unicast单播.broadcast广播.multicast组播,书写一个简单地例子:然后写了一个小的Qt例子,用来实现和验证它的空间的一些属性和功能 ...
- skynet框架应用 (八) Multicast组播
8 Multicast组播 8.1 Multicast介绍 local mc = require "skynet.multicast" 引入 multicast 模块后,你可以 ...
- 网工笔记(三):IP Multicast组播技术
IP多路组播技术,英文为IP Multicast, 就是英文文档里经常说到的BUM报文里的大M.这是一门特别的技术,它从2层到3层协议mac地址到IP地址都自成一体.很多网工同行只在IE考试里学习了 ...
最新文章
- django html数据库连接,Django数据库连接的问题
- 推荐收藏 | 算法工程师常见面试问题及相关资料汇总
- 2019年企业云呈现五大技术发展趋势
- 和 的运算(值)结果 及 Boolean结果
- centos jupyter 安装_centos7安装 jupyter
- 那些云中的负载均衡器——Azure、AWS和NetScaler
- Python语言被列入全国计算机等级考试科目中
- python_numpy_中的matrix与array的区别
- MySQL Workbench 8.0 CE卸载不了
- 中国城市群产业建设风险与投资发展决策建议报告2022版
- 配置Skype for business 2015混合部署
- 互联网行业中最常用的数据库——MySQL数据库介绍
- 中国量化金融行业 全解 金融工程 计算机 统计学 金融 专业领域 就业指南
- 【图像融合】基于matlab高分辨率全色图IHS图像融合(含评价指标)【含Matlab源码 2406期】
- python初级试题及答案
- 数据堂-数加加众包任务招募啦~!说方言,来赚钱
- QQ浏览器查看Cookies
- 信道均衡-LMS自适应均衡算法matlab实现
- day29 HTML基础
- 现货黄金入门与技巧:如何在财经数据、新闻