[SmartFoxServer概述]Zones和Rooms结构
Zones和Rooms结构:
相对于SFS 1.X而言,在Zones和Rooms的配置上,SFS2X有了显著的改善。尤其是我们建立了房组这样一个简单的概念,它允许在一个逻辑组中管理Rooms,从而独立于其他Rooms。Users可以订阅发生在该组中他们只感兴趣的事件,而忽略其他所有的。
这种方法的好处是通过服务器发送的初始room列表将会更小,并且对于发送到每个客户端的事件数量也会大幅度减少,特别是在一些高流量的应用程序中。
概念说明示例:

User可以订阅最初的Room群消息和接收Room的升级消息(例如最新创建的Room或者移除Room,User数量的改变和Room变量升级等),不过这些都是限定于当前的Room群环境下。如果User有兴趣玩游戏,他可以选择订阅任何一个游戏群组,然后查看哪个游戏在运行再选择加入。User也可以随时订阅任一群组的消息,同样也可以拒绝订阅。即使他们不会再接收他们不在的Room任何更新消息,不过他们依然可以加入Zone中的任意一个Room。
最新的方法是将Zone和Room配置更进一步相结合,允许程序设计人员可以创建多群组,游戏,个人Room,私人领域等高度复杂的系统。最新特点同时包含了一套更合理和更具组织性的方式来管理Zone中的所有Room的同时,最低限度地保持客户端更新量。
下表描述了一些不同的可能情况:
·User在没有订阅任何Room组消息的情况下加入到Zone中:
在这种情况下,User将会收到一个空的room列表,同时不能通过服务器对Room事件进行更新。如果你想让user在不接收他们不需要的Room更新的情况下,与你的服务端扩展模块进行交互的话,可以考虑这种设定。常见的使用情况有:用户注册窗口,咨询一个用户搜索功能或者其他在不需要与其他客户端交互的地方与用户相关的动作。
·User加入到Zone中并订阅了一个Room群:
这个可能是最常见的使用情况,对于SFS1.X更是如此。而在这里的不同之处是,room列表只包含群中选中的room,从而过滤掉其他。客户端会默认更新最新创建的或者移除的room。开发人员也可以配置其他事件,例如更新user数量,room变量等级等。
·User加入到Zone中并订阅了多个Room群:
订阅多个群需要进行更复杂的Room过滤。玩家可以通过群中选定的Room获取自定义的room列表。通常情况下,客户端可以加入到群中,可能是一个特定主题的聊天群和一个玩家玩游戏的游戏群。
最后,群组可以在运行过程中创建,并且可以执行动态订阅/取消订阅。
详尽的Zone和Room事件:
通过SFS2X,你可以更好地控制每个Zone和Room的事件。以下是在Administration Tool中的Room配置窗口。

上面的窗口告诉你,当你创建了一个新的Room,如何设置好Room级别事件和权限。根据以上的配置,users可以改变Room的名称和密码,同时可以禁止重设大小(改变容量)。公共消息也可以在Room和所有可用事件中进行发布。
在其他的Room中,你可能想设定不同的配置,禁止一些事件和提供一套不同的权限。
Room定义了两类设定:权限(Permissions)和事件(Events)。
权限(Permissions)表明了在运行过程中可执行的相关Room操作。
##ROOM_NAME_CHANGE:在运行过程中是否可以改变Room名称
##PASSWORD_STATE_CHANGE:在运行过程中Room密码是否可以改变
##PUBLIC_MESSAGES:Room是否支持发布公共消息
##CAPACITY_CHANGE:在运行过程中Room的容量是否可以改变
事件(Events)表明了客户端加入到Room中所触发的事件。
##USER_ENTER_EVENT:当user加入到Room中是否发送更新消息
##USER_EXIT_EVENT:当user离开Room时是否发送更新消息
##USER_COUNT_CHANGE_EVENT:是否需要每次Room里的user数量发生改变时触发事件
##USER_VARIABLES_UPDATE_EVENT:当user设置其User变量时是否发送更新消息
最后,Room有一种新的去除模式定义方法,该方法表明了是否需要或者什么时候需要自动移除Room。具体设置如下:
#Default:根据在SFS1.x定义的默认规则移除Room。
#When_Empty:当Room为空时移除Room。
#When_Empty_And_Creator_Is_Gone:当Room为空和创建者离线时,移除Room。
#Never_Remove:Room不允许自动移除。
User数量更新:
在SFS中最消耗带宽的更新就是User数量更新事件,每次所有Room中user数量改变了,它都需要向所有的user发送消息。在高峰期中该事件每秒会被触发几十次,导致带宽消耗和消息丢失的问题。
在SFS2X中加入了引擎级的优化,最大程度上减少了user数量更新的影响。
#报文优先级:SFS2X引擎可以对每个低优先级响应的报文指定优先级别,例如当客户端消息队列繁忙时,User数量更新请求将被丢弃。当客户端使用慢连接时,可以显著减少消息丢失的问题。
#User数量更新节流:为了进一步增加对这一事件的控制程度,SFS2X可以在配置上设置为“减速”的速度,这样就可以将消息收集起来后选择最重要的一条消息进行发送。换言之,你可以在该事件被触发后指定一个特定的时间间隔。在该时间间隔中所作的更新会集中最新的消息,摒弃掉旧消息。
为了让你更清楚节流系统如何运行,我们假设时间间隔为2000毫秒。以下是在时间间隔中发生的改变:

以下是在下一个时间间隔真正发送的更新:

只有最新user数的数据得到了更新,而其他的被过滤了。
Room变量和User变量:
SFS2X对Room/User变量方面作出了很大的改善,在客户端和服务端两端增加更多的灵活性。
其中反映最多的增强是支持嵌套对象,我们已经补充说了。在数组和字典两方面都充分支持了。而我们也添加了下面的两种新的设定:
#隐藏:当Room/User变量被隐藏,它将不会发送至客户端。这便可以判定,哪个变量只属于服务端,哪个变量与客户端保持同步。新特点在保持自定义数据上不再需要用两种不同方法连接到一个Room/User对象,在之前的SFS1.x中你必须使用Room/User变量和Room/User属性,在SFS2X上,所有自定义的数据都通过Room/User变量来处理。
#全局:这是Room变量的属性。全局Room变量在Zone层更新,换言之,也就是在Room外更新。这意味着设为全局属性的Room变量会在同一个Room群中的所有客户端作出更新。这是要求多次,期待许久的特点了。
下面是在Extension中设置Room变量的快速例子:
private void setSomeVariables(Room room, User owner)
{
List<RoomVariable> listOfVars = new ArrayList<RoomVariable>();
listOfVars.add( new SFSRoomVariable("bgImage", "coolBackground.jpg") );
listOfVars.add( new SFSRoomVariable("stars", 4) ); RoomVariable hiddenVar = new SFSRoomVariable("isPremiumUsersOnly", true);
hiddenVar.setHidden(true);
listOfVars.add(hiddenVar); // Set variables
sfsApi.setRoomVariables(owner, room, listOfVars)
}
正如你所见,hiddenVar的Room变量被设置为hidden,它将不会发送到客户端。服务端的代码将会检测该变量,查看该Room是不是只属于付费用户。
在客户端(AS3),设置该变量也同样简单。
private function setSomeVariables(room:Room):void
{
var listOfVars:Array = new Array() listOfVars.push( new SFSRoomVariable("bgImage", "coolBackground.jpg") )
listOfVars.push( new SFSRoomVariable("stars", 4) ) // nested object
var chatSettings:SFSObject = new SFSObject()
chatSettings.putUtfStringArray("allowedFonts", ["Verdana", "Arial", "Times New Roman"])
chatSettings.putIntArray("allowedFontSizes", [10,11,12,13])
chatSettings.putBool("isBoldAllowed", true)
chatSettings.putBool("isItalicAllowed", true)
chatSettings.putBool("isUnderlineAllowed", false) listOfVars.push( new SFSRoomVariable("settings", chatSettings)) // Set variables
sfs.send( new SetRoomVariablesRequest(listOfVars, room) )
}
[SmartFoxServer概述]Zones和Rooms结构的更多相关文章
- [SmartFoxServer概述]SFS2X特点
SFS2X 特点概述 SFS2X采用SFS核心原理并在新的方向进行扩展,介绍了许多改善方案,同时专注于几个方面:使用简单化,通用化和性能化. *使用简单化:清除了SFS之前版本中所有不必要的复杂方法, ...
- html概述和html基本结构:
html概述: HTML是Hyper Text Mark-up Language(超文本标记语言)的首字母简写,超文本是指超链接,标记指的是标签,是一种用来制作网页的语言,这种语言由一个个的标签组成, ...
- 学习笔记:oracle学习一:oracle11g体系结构之体系结构概述和逻辑存储结构
目录 1.oracle 11g体系结构概述 1.1 三个重要概念 1.2 oracle数据库存储结构 2 逻辑存储结构 2.1 数据块(Data Blocks) 2.2 数据区(Extent) 2.3 ...
- [SmartFoxServer概述]SFS2X协议
SFS2X 客户端-服务器协议 SFS2X使用了一种高效的二进制协议,这种协议可以使服务器在各方面都表现出色.消息通过客户端和服务器引擎得到快速转换,在带宽上传输可更加轻便.附加的即时压缩,能够在不影 ...
- [SmartFoxServer概述]SFS2X栈平台
SmartFoxServer 2X 栈平台 在这有一张SmartFoxServer 2X平台的鸟瞰图,接下来会简要介绍栈中的每个组件. 首先是服务器的核心——网络引擎(代号BitSwarm),它是用以 ...
- [SmartFoxServer概述]使用文档
如何使用文档和例子 这份文档提供了一份关于如何通过SmartFoxServer 2X(缩写SFS2X)文档掌握要点的快速教程.在使用例子和技术文档之前,我们建议先参考以下主题内容. 不管你是Smart ...
- R-tree 一种空间搜索的动态索引结构
译林:R-tree 一种空间搜索的动态索引结构Antonm Guttman 摘要为了有效地处理空间数据,正如在计算机辅助设计和地理数据应用中所要求的那样,数据库需要一种索引机制能根据它们的空间位置快速 ...
- 流程控制语句if基本概述
目录 1. 流程控制语句if基本概述 2. 流程控制语句if文件比较 判断文件是否存在,返回方式 使用变量的方法进行判断 请输入你要备份的数据库名称: wordpress 请输入你要备份的数据库密码: ...
- 开发dubbo应用程序(二)dubbo注册中心相关概述
1.注册中心概述 在Dubbo微服务体系中,注册中心是其核心组件之一.Dubbo通过注册中心实现了分布式环境中各微服务之间的注册与发现,是各分布式节点之间的纽带.其主要作用如下: 动态加入.一个服 ...
随机推荐
- adb devices offline 问题大总结
遇到doc对话框中adb devices ,一直显示设备处于offline状态,各种搜后安装所谓的: 1.开启usb调试模式2.关闭第三方手机助手软件3.重启adb服务 adb kill-ser ...
- 基于案例贯通 Spark Streaming 流计算框架的运行源码
本期内容 : Spark Streaming+Spark SQL案例展示 基于案例贯穿Spark Streaming的运行源码 一. 案例代码阐述 : 在线动态计算电商中不同类别中最热门的商品排名,例 ...
- 第三章 数组与字符串 UVa1588 Kickdown
题目要求简述:给定长度分别为n1,n2(n1,n2<=100)且每列的高度只为1或者2的长条.需要将他们放入一个高度为3的容器,问能够容纳它们的最短容器长度. 分析: 对于这样的题目显而易见有两 ...
- SQLite数据库文件格式
数据库命名约定 sqlite3_open()API用到数据库的文件名,可以是相对当前工作目录的相对路径名,也可以是从系统根文件树开始的完整路径名.任何被本地文件系统接受的正规文件名都是好的. 如果文件 ...
- 使用SftpDrive+SourceInsight阅读开源代码
在虚拟机环境下使用Linux编写和阅读代码,我之前一直是通过Xshell利用ssh登录至虚拟机从而在命令行下使用vim来进行的.目前有阅读开源代码的需要,虽然vim+ctags+cscope可以完成这 ...
- removeClass() 方法
删除元素的class类别用removeClass() 方法,与addClass()方法对应.具体使用如下: 如果要删除 p 标记是 cls0 的类别,可以使用如下的代码: $("p" ...
- java1.7集合源码阅读: Vector
Vector是List接口的另一实现,有非常长的历史了,从jdk1.0开始就有Vector了,先于ArrayList出现,与ArrayList的最大区别是:Vector 是线程安全的,简单浏览一下Ve ...
- JS之延迟处理
$(document).ready(function () { $("#zidong3,#zidong1").click(function () { $("#zidong ...
- android之存储篇_SQLite数据库_让你彻底学会SQLite的使用
SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么. 例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中 ...
- CSS样式之语法
选择符 选择符 {属性1:属性值1;属性2:属性值2} 选择符(selector):指定样式适用的标签,除指定标签外,样式不起作用 属性:样式的关键字 属性值:描述样式的值: 格式:属性与属性之间使用 ...