《服务器引擎的实现方法和系统.pdf》由会员分享,可在线阅读,更多相关《服务器引擎的实现方法和系统.pdf(26页珍藏版)》请在专利查询网上搜索。
1、(10)申请公布号 CN 104281488 A (43)申请公布日 2015.01.14 CN 104281488 A (21)申请号 201310284753.5 (22)申请日 2013.07.08 G06F 9/46(2006.01) G06F 9/48(2006.01) (71)申请人 博雅网络游戏开发 (深圳) 有限公司 地址 518057 广东省深圳市南山区中山园路 1001 号 TCL 产业园国际E 城 D3栋 9B C (72)发明人 黄涵 池育龙 夏志浩 (74)专利代理机构 广州华进联合专利商标代理 有限公司 44224 代理人 何平 (54) 发明名称 服务器引擎的实现。
2、方法和系统 (57) 摘要 本发明提供了一种服务器引擎的实现方法和 系统。所述方法包括 : 进行事件监听得到当前触 发的事件 ; 进行事件分发得到所述事件位于胶合 层的事件处理对象 ; 通过所述位于胶合层的事件 处理对象调用 Lua 脚本处理所述事件。所述系统 包括 : 监听模块, 用于进行事件监听得到当前触 发的事件 ; 事件分发模块, 用于进行事件分发得 到所述事件位于胶合层的事件处理对象 ; 脚本调 用模块, 用于通过所述位于胶合层的事件处理对 象调用 Lua 脚本处理所述事件。采用本发明能降 低学习成本, 实现快速开发。 (51)Int.Cl. 权利要求书 3 页 说明书 15 页 附。
3、图 7 页 (19)中华人民共和国国家知识产权局 (12)发明专利申请 权利要求书3页 说明书15页 附图7页 (10)申请公布号 CN 104281488 A CN 104281488 A 1/3 页 2 1. 一种服务器引擎的实现方法, 包括如下步骤 : 进行事件监听得到当前触发的事件 ; 进行事件分发得到所述事件位于胶合层的事件处理对象 ; 通过所述位于胶合层的事件处理对象调用 Lua 脚本处理所述事件。 2. 根据权利要求 1 所述的方法, 其特征在于, 所述进行事件分发得到所述事件位于胶 合层的事件处理对象的步骤之前, 所述方法还包括 : 判断当前触发的事件是否为服务器事件, 若否,。
4、 则进入进行事件分发得到所述事件位 于胶合层的事件处理对象的步骤, 若是, 则 根据监听得到的服务器事件所对应的客户端连接数据创建相应的客户端事件处理对 象 ; 存储所述创建的客户端事件处理对象。 3. 根据权利要求 2 所述的方法, 其特征在于, 所述存储所述创建的客户端事件处理对 象的步骤包括 : 从空闲链表提取节点, 在所述节点存入所述创建的客户端事件处理对象 ; 将所述存入客户端事件处理对象的节点添加至已使用链表中。 4. 根据权利要求 1 所述的方法, 其特征在于, 所述进行事件分发得到所述事件位于胶 合层的事件处理对象的步骤包括 : 获取所述事件对应的数据, 并解析所述事件对应的数。
5、据得到相应的位置信息和验证信 息 ; 查找所述胶合层中已使用链表得到所述位置信息对应的节点 ; 通过所述验证信息验证所述查找得到的节点与所述事件是否匹配, 若是, 则 获取存储于所述节点中的事件处理对象。 5. 根据权利要求 1 所述的方法, 其特征在于, 所述通过所述位于胶合层的事件处理对 象调用 Lua 脚本处理所述事件的步骤包括 : 通过所述位于胶合层的事件处理对象调用 Lua 接口层中相应的接口函数, 通过所述接 口函数触发所述 Lua 脚本处理所述事件。 6. 根据权利要求 1 所述的方法, 其特征在于, 所述进行事件监听得到当前触发的事件 和所述事件对应的数据的步骤之前, 所述方法。
6、还包括 : 从设定的定时器事件中获取即将到期的最小时间。 7. 根据权利要求 2 所述的方法, 其特征在于, 所述进行事件监听得到当前触发的事件 的步骤包括 : 以所述获取的最小时间作为事件监听的超时值, 开启事件监听, 并通过网络事件的触 发或超时停止当前的事件监听得到当前触发的网络事件或定时器事件 ; 判断网络事件是否被触发, 若是, 则进入判断当前触发的事件是否为服务器事件的步 骤, 若否, 则 进入所述进行事件分发得到所述事件位于胶合层的事件处理对象的步骤。 8. 根据权利要求 7 所述的方法, 其特征在于, 所述进行事件分发得到所述事件位于胶 合层的事件处理对象的步骤包括 : 依次检。
7、查每一定时器链表, 在所述定时器链表中按照添加定时器事件处理对象的先后 权 利 要 求 书 CN 104281488 A 2 2/3 页 3 顺序依次判断定时器事件处理对象是否到期, 若是, 则 获取所述到期的定时器事件处理对象。 9. 根据权利要求 8 所述的方法, 其特征在于, 所述方法还包括 : 若判断到网络事件被触发, 且所述网络事件被处理完毕之后将进入所述依次检查每一 定时器链表的步骤。 10. 一种服务器引擎的实现系统, 其特征在于, 包括 : 监听模块, 用于进行事件监听得到当前触发的事件 ; 事件分发模块, 用于进行事件分发得到所述事件位于胶合层的事件处理对象 ; 脚本调用模块。
8、, 用于通过所述位于胶合层的事件处理对象调用 Lua 脚本处理所述事 件。 11. 根据权利要求 10 所述的系统, 其特征在于, 所述系统还包括 : 事件判断模块, 用于判断当前触发的事件是否为服务器事件, 若否, 则通知所述事件分 发模块, 若是, 则通知客户端对象创建模块 ; 所述客户端对象创建模块用于根据监听得到的服务器事件所对应的客户端连接数据 创建相应的客户端事件处理对象 ; 存储模块, 用于存储所述创建的客户端事件处理对象。 12. 根据权利要求 11 所述的系统, 其特征在于, 所述存储模块包括 : 节点提取单元, 用于从空闲链表提取节点, 在所述节点存入所述创建的客户端事件处。
9、 理对象 ; 节点添加单元, 用于将所述存入客户端事件处理对象的节点添加至已使用链表中。 13. 根据权利要求 10 所述的系统, 其特征在于, 所述事件分发模块包括 : 解析单元, 用于获取所述事件对应的数据, 并解析所述事件对应的数据得到相应的位 置信息和验证信息 ; 查找单元, 用于查找所述胶合层中已使用链表得到所述位置信息对应的节点 ; 匹配单元, 用于通过所述验证信息验证所述查找得到的节点与所述事件是否匹配, 若 是, 则通知事件处理对象获取单元 ; 所述事件处理对象获取单元用于获取存储于所述节点中的事件处理对象。 14. 根据权利要求 10 所述的系统, 其特征在于, 所述脚本调用。
10、模块还用于通过所述位 于胶合层的事件处理对象调用 Lua 接口层中相应的接口函数, 通过所述接口函数触发所述 Lua 脚本处理所述事件。 15. 根据权利要求 10 所述的系统, 其特征在于, 所述系统还包括 : 时间获取模块, 用于从所述设定的定时器事件中获取即将到期的最小时间。 16. 根据权利要求 11 所述的系统, 其特征在于, 所述监听模块包括 : 事件监听单元, 用于以所述获取的最小时间作为事件监听的超时值, 开启事件监听, 并通过网络事件的触发或超时停止当前的事件监听得到当前触发的网络事件或定时器事 件 ; 触发判断单元, 用于判断网络事件是否被触发, 若是, 则通知所述事件判断。
11、模块, 若否, 则通知所述事件分发模块。 17. 根据权利要求 16 所述的系统, 其特征在于, 所述事件分发模块包括 : 权 利 要 求 书 CN 104281488 A 3 3/3 页 4 检查单元, 用于依次检查每一定时器链表, 在所述定时器链表中按照添加定时器事件 处理对象的先后顺序依次判断定时器事件处理对象是否到期, 若是, 则通知定时器对象获 取单元 ; 所述定时器对象获取单元用于获取所述到期的定时器事件处理对象。 18. 根据权利要求 17 所述的系统, 其特征在于, 若所述触发判断单元判断到所述网络 事件被触发, 且所述网络事件被所述脚本调用模块处理完毕之后将通知所述检查单元。。
12、 权 利 要 求 书 CN 104281488 A 4 1/15 页 5 服务器引擎的实现方法和系统 技术领域 0001 本发明涉及互联网应用技术, 特别是涉及一种服务器引擎的实现方法和系统。 背景技术 0002 随着互联网应用的发展, 通过服务器引擎所搭载的应用逻辑也越来越多, 例如, 游 戏服务器引擎大都接入了多个游戏, 用户通过客户端引擎与游戏服务器引擎之间的交互即 可运行接入的某一游戏。 0003 传统的服务器引擎大都是基于 ACE(Adaptive Communication Environmen, 自适 配通信环境) 的开源架构实现的, 但是由于 ACE 的开源架构过于厚重, 开发。
13、人员在应用基于 ACE 的开源架构所实现的服务器引擎进行开发时将存在着学习成本过高, 无法进行快速开 发的缺陷。 发明内容 0004 基于此, 有必要针对基于 ACE 的开源架构所实现的服务器引擎存在着学习成本过 高, 无法进行快速开发的技术问题, 提供一种能降低学习成本, 实现快速开发的服务器引擎 的实现方法。 0005 此外, 还有必要提供一种能降低学习成本, 实现快速开发的服务器引擎的实现系 统。 0006 一种服务器引擎的实现方法, 包括如下步骤 : 0007 进行事件监听得到当前触发的事件 ; 0008 进行事件分发得到所述事件位于胶合层的事件处理对象 ; 0009 通过所述位于胶合。
14、层的事件处理对象调用 Lua 脚本处理所述事件。 0010 在其中一个实施例中, 所述进行事件分发得到所述事件位于胶合层的事件处理对 象的步骤之前, 所述方法还包括 : 0011 判断当前触发的事件是否为服务器事件, 若否, 则进入进行事件分发得到所述事 件位于胶合层的事件处理对象的步骤, 若是, 则 0012 根据监听得到的服务器事件所对应的客户端连接数据创建相应的客户端事件处 理对象 ; 0013 存储所述创建的客户端事件处理对象。 0014 在其中一个实施例中, 所述存储所述创建的客户端事件处理对象的步骤包括 : 0015 从空闲链表提取节点, 在所述节点存入所述创建的客户端事件处理对象。
15、 ; 0016 将所述存入客户端事件处理对象的节点添加至已使用链表中。 0017 在其中一个实施例中, 所述进行事件分发得到所述事件位于胶合层的事件处理对 象的步骤包括 : 0018 获取所述事件对应的数据, 并解析所述事件对应的数据得到相应的位置信息和验 证信息 ; 说 明 书 CN 104281488 A 5 2/15 页 6 0019 查找所述胶合层中已使用链表得到所述位置信息对应的节点 ; 0020 通过所述验证信息验证所述查找得到的节点与所述事件是否匹配, 若是, 则 0021 获取存储于所述节点中的事件处理对象。 0022 在其中一个实施例中, 所述通过所述位于胶合层的事件处理对象。
16、调用 Lua 脚本处 理所述事件的步骤包括 : 0023 通过所述位于胶合层的事件处理对象调用 Lua 接口层中相应的接口函数, 通过所 述接口函数触发所述 Lua 脚本处理所述事件。 0024 在其中一个实施例中, 所述进行事件监听得到当前触发的事件和所述事件对应的 数据的步骤之前, 所述方法还包括 : 0025 从设定的定时器事件中获取即将到期的最小时间。 0026 在其中一个实施例中, 所述进行事件监听得到当前触发的事件的步骤包括 : 0027 以所述获取的最小时间作为事件监听的超时值, 开启事件监听, 并通过网络事件 的触发或超时停止当前的事件监听得到当前触发的网络事件或定时器事件 ;。
17、 0028 判断网络事件是否被触发, 若是, 则进入判断当前触发的事件是否为服务器事件 的步骤, 若否, 则 0029 进入所述进行事件分发得到所述事件位于胶合层的事件处理对象的步骤。 0030 在其中一个实施例中, 所述进行事件分发得到所述事件位于胶合层的事件处理对 象的步骤包括 : 0031 依次检查每一定时器链表, 在所述定时器链表中按照添加定时器事件处理对象的 先后顺序依次判断定时器事件处理对象是否到期, 若是, 则 0032 获取所述到期的定时器事件处理对象。 0033 在其中一个实施例中, 所述方法还包括 : 0034 若判断到网络事件被触发, 且所述网络事件被处理完毕之后将进入所。
18、述依次检查 每一定时器链表的步骤。 0035 一种服务器引擎的实现系统, 包括 : 0036 监听模块, 用于进行事件监听得到当前触发的事件 ; 0037 事件分发模块, 用于进行事件分发得到所述事件位于胶合层的事件处理对象 ; 0038 脚本调用模块, 用于通过所述位于胶合层的事件处理对象调用 Lua 脚本处理所述 事件。 0039 在其中一个实施例中, 所述系统还包括 : 0040 事件判断模块, 用于判断当前触发的事件是否为服务器事件, 若否, 则通知所述事 件分发模块, 若是, 则通知客户端对象创建模块 ; 0041 所述客户端对象创建模块用于根据监听得到的服务器事件所对应的客户端连接。
19、 数据创建相应的客户端事件处理对象 ; 0042 存储模块, 用于存储所述创建的客户端事件处理对象。 0043 在其中一个实施例中, 所述存储模块包括 : 0044 节点提取单元, 用于从空闲链表提取节点, 在所述节点存入所述创建的客户端事 件处理对象 ; 0045 节点添加单元, 用于将所述存入客户端事件处理对象的节点添加至已使用链表 说 明 书 CN 104281488 A 6 3/15 页 7 中。 0046 在其中一个实施例中, 所述事件分发模块包括 : 0047 解析单元, 用于获取所述事件对应的数据, 并解析所述事件对应的数据得到相应 的位置信息和验证信息 ; 0048 查找单元,。
20、 用于查找所述胶合层中已使用链表得到所述位置信息对应的节点 ; 0049 匹配单元, 用于通过所述验证信息验证所述查找得到的节点与所述事件是否匹 配, 若是, 则通知事件处理对象获取单元 ; 0050 所述事件处理对象获取单元用于获取存储于所述节点中的事件处理对象。 0051 在其中一个实施例中, 所述脚本调用模块还用于通过所述位于胶合层的事件处理 对象调用 Lua 接口层中相应的接口函数, 通过所述接口函数触发所述 Lua 脚本处理所述事 件。 0052 在其中一个实施例中, 所述系统还包括 : 0053 时间获取模块, 用于从所述设定的定时器事件中获取即将到期的最小时间。 0054 在其中。
21、一个实施例中, 所述监听模块包括 : 0055 事件监听单元, 用于以所述获取的最小时间作为事件监听的超时值, 开启事件监 听, 并通过网络事件的触发或超时停止当前的事件监听得到当前触发的网络事件或定时器 事件 ; 0056 触发判断单元, 用于判断网络事件是否被触发, 若是, 则通知所述事件判断模块, 若否, 则通知所述事件分发模块。 0057 在其中一个实施例中, 所述事件分发模块包括 : 0058 检查单元, 用于依次检查每一定时器链表, 在所述定时器链表中按照添加定时器 事件处理对象的先后顺序依次判断定时器事件处理对象是否到期, 若是, 则通知定时器对 象获取单元 ; 0059 所述定。
22、时器对象获取单元用于获取所述到期的定时器事件处理对象。 0060 在其中一个实施例中, 若所述触发判断单元判断到所述网络事件被触发, 且所述 网络事件被所述脚本调用模块处理完毕之后将通知所述检查单元。 0061 上述服务器引擎的实现方法和系统, 进行事件监听得到当前触发的事件, 进行事 件分发得到该事件位于胶合层的事件处理对象, 通过位于胶合层的事件处理对象调用 Lua 脚本处理该事件, 由于Lua脚本寄存于服务器引擎中, 服务器引擎通过Lua脚本实现事件的 处理, 使得开发人员通过Lua脚本即可实现新的应用逻辑的开发, 由于Lua脚本是轻量级的 脚本语言, 因此大大降低了开发人员对服务器引擎。
23、的学习成本, 以实现服务器引擎中新的 应用逻辑的快速开发。 附图说明 0062 图 1 为一个实施例中服务器引擎的实现方法的流程图 ; 0063 图 2 为一个实施例中服务器引擎的框架示意图 ; 0064 图 3 为另一个实施例中服务器引擎的实现方法的流程图 ; 0065 图 4 为图 3 中存储创建的客户端事件处理对象的方法流程图 ; 0066 图 5 为一个实施例中进行事件分发得到该事件位于胶合层的事件处理对象的方 说 明 书 CN 104281488 A 7 4/15 页 8 法流程图 ; 0067 图 6 为一个实施例中进行事件监听得到当前触发的事件的方法流程图 ; 0068 图 7 。
24、为另一个实施例中进行事件分发得到该事件位于胶合层的事件处理对象的 方法流程图 ; 0069 图 8 为一个实施例中定时器链表的示意图 ; 0070 图 9 为一个实施例中服务器引擎的原理图 ; 0071 图 10 为一个实施例中客户端和服务器的通讯示意图 ; 0072 图 11 为一个实施例中服务器引擎的实现系统的结构示意图 ; 0073 图 12 为另一个实施例中服务器引擎的实现系统的结构示意图 ; 0074 图 13 为图 12 中存储模块的结构示意图 ; 0075 图 14 为一个实施例中事件分发模块的结构示意图 ; 0076 图 15 为一个实施例中监听模块的结构示意图 ; 0077 。
25、图 16 为另一个实施例中事件分发模块的结构示意图。 具体实施方式 0078 如图 1 所示, 在一个实施例中, 一种服务器引擎的实现方法, 包括如下步骤 : 0079 步骤 S110, 进行事件监听得到当前触发的事件。 0080 本实施例中, 进行事件监听以得到服务器中触发的事件, 当前触发的事件包括网 络事件和定时器事件, 其中, 网络事件指的是与网络通讯相关的事件, 例如, 客户端所发送 的通讯报文到达服务端所触发的事件, 也可以是服务端向客户端发送通讯报文的事件 ; 定 时器事件指的是服务器所需要定时执行的任务, 例如, 每隔 30 稍微检查服务器与客户端之 间的连接是否仍然有效。 0。
26、081 进一步的, 如图 2 所示, 网络通讯层为服务器引擎的基础, 用于实现事件的监听。 0082 步骤 S130, 进行事件分发得到该事件位于胶合层的事件处理对象。 0083 本实施例中, 胶合层相当于服务器引擎的中间层, 用于胶合应用层中的各种应用 逻辑和底层的原语层, 通过 C+ 语言的清晰简洁表述将大为简化使用接口开发的复杂性, 当前触发的事件在胶合层将被分发至相应的事件处理对象, 以调用相应的事件处理对象进 行相应处理。具体的, 每一触发的事件均有唯一对应的事件处理对象。 0084 在一个实施例中, 服务器引擎的胶合层将通过 C+ 语言实现, 以为服务器提供更 为丰富, 甚至复杂的。
27、算法和接口, 便于实现服务器中的模块化设计, 进而提高扩展性。 0085 步骤 S150, 通过位于胶合层的事件处理对象调用 Lua 脚本处理该事件。 0086 本实施例中, Lua 脚本寄生于服务器引擎中, 作为服务器引擎中的应用层实现各种 应用逻辑, 位于胶合层的事件处理对象将用于负责接收和处理当前触发的事件。当前触发 的事件所属的事件处理对象将调用 Lua 脚本中的相应对象进行事件的处理, 以实现该事件 的响应。 0087 请结合参阅图 2, Lua 脚本在服务器引擎中将存在于 Lua 应用层中, 用于实现各种 应用逻辑, 因此服务器引擎所触发的各种事件将通过胶合层所提供的接口传递到 L。
28、ua 应用 层中, 进而由 Lua 脚本响应该事件, 实现相应的功能。 0088 由于 Lua 脚本是用于扩展 C+ 编程的轻量级脚本, 较为易懂, 因此, 对于开发人员 说 明 书 CN 104281488 A 8 5/15 页 9 而言, 降低了编码难度, 不需要耗费过多的学习成本, 进而使得基于服务器引擎的各种应用 开发快速大为提高, 缩短了应用的开发周期。 0089 如图 3 所示, 在一个实施例中, 上述步骤 S130 之前, 该方法还包括 : 0090 步骤 S210, 判断当前触发的事件是否为服务器事件, 若否, 则进入步骤 S130, 若 是, 则进入步骤 S230。 0091。
29、 本实施例中, 当前触发的事件可能为网络事件或定时器事件, 其中, 网络事件包括 了服务器事件和客户端事件, 其中, 服务器事件为可读事件, 服务器事件的触发将代表着新 的客户端与服务器连接 ; 客户端事件为可读事件或可写事件, 是区别于服务器事件的其它 网络事件, 客户端事件为可读事件则代表着有新的通讯报文到达, 可写事件则代表着有信 息要返回给客户端。 0092 对当前触发的事件进行判断, 若判断到当前触发的事件为服务器事件, 则说明有 新的客户端与服务器连接, 需要对客户端的添加做相关处理, 若判断到当前触发的事件不 为服务器事件, 则说明当前所触发的事件为客户端事件或定时器事件, 需要。
30、进入步骤 S130, 以对当前触发的事件进行分发。 0093 步骤 S230, 根据监听得到的服务器事件所对应的客户端连接数据创建相应的客户 端事件处理对象。 0094 本实施例中, 对于当前触发的服务器事件, 将接收相应的客户端连接数据, 以通过 接收的客户端连接数据初始化客户端连接, 在服务器引擎中注册客户端, 创建该客户端所 对应的客户端事件处理对象。具体的, 客户端事件处理对象将被用于处理对应的客户端在 服务器引擎中触发的客户端事件。 0095 步骤 S250, 存储创建的客户端事件处理对象, 根据所述客户端事件处理对象所在 的存储位置生成位置信息, 并向所述客户端回传所述位置信息和验。
31、证信息。 0096 本实施例中, 将创建的客户端事件处理对象进行存储, 以便于客户端事件被触发 时, 通过分发至对应的客户端事件处理对象进行处理。 0097 如图 4 所示, 在一个实施例中, 上述步骤 S250 包括 : 0098 步骤 S251, 从空闲链表提取节点, 在节点存入创建的客户端事件处理对象。 0099 本实施例中, 为便于进行客户端事件处理对象的存储和提取, 将设置空闲链表和 已使用链表实现, 空闲链表和已使得链表以数组作为存储单元。 0100 从空闲链表中取任一节点, 该节点即为空闲节点, 可将创建的客户端事件处理对 象存入这一取得到节点中。 与传统的存储机制相比较, 不需。
32、要进行空闲节点的查找, 换而言 之, 不需要从头到尾挨个查询节点是否空闲, 其查询的时间复杂度为 O(n) , 其中, n 为查询 操作的规模, 并且随着 n 的增大而增大, 时间复杂度 O(n) 越小, 则执行效率越高。 0101 而通过上述过程所进行的客户端事件处理对象的存储可直接在空闲链表中取出 第一个节点即可得到空闲节点, 其时间复杂度为 O(1) , 大大地降低了时间复杂度。 0102 步骤 S253, 将存入客户端事件处理对象的节点添加至已使用链表中。 0103 本实施例中, 通过已使用链表实现多个客户端事件处理对象的存储, 对于连接至 服务器的海量客户端而言, 将海量客户端所对应。
33、的海量客户端事件处理对象存储于已使用 链表将保证了存储的有序性和高效性。 0104 相应的, 在通过空闲链表和已使用链表所实现的客户端事件处理对象的存储之 说 明 书 CN 104281488 A 9 6/15 页 10 后, 一旦某一客户端与服务器断开连接, 则需要对相应的客户端事件处理对象进行删除。 0105 具体的, 将对已使用链表进行查找, 以查找得到断开连接的客户端所对应的客户 端事件处理对象以及该客户端事件处理对象所在的节点, 清除节点中存储的客户端事件处 理对象, 并将该节点从已使用链表删除, 并添加至空闲链表中, 通过空闲链表和已使用链表 所实现的存储机制将保证了时间复杂度是恒。
34、定的, 不必考虑时间复杂度的增加。 0106 如图 5 所示, 在一个实施例中, 上述步骤 S130 包括 : 0107 步骤 S131a, 获取该事件对应的数据, 并解析该事件对应的数据得到相应的位置信 息和验证信息。 0108 本实施例中, 该事件对应的数据是客户端传回的数据, 包括了该客户端与服务器 引擎建立连接时所得到的位置信息和该事件所对应的验证信息。监听到事件的触发之后, 将获取该事件所对应的数据, 并进行解析, 以得到数据中的位置信息和验证信息。 0109 进一步的, 该事件所对应的数据包括了位置信息和验证信息, 其中, 位置信息用于 指示处理该事件的事件处理对象的存储位置, 验。
35、证信息则用于验证该位置信息所对应的节 点中存储的事件处理对象是否与该事件相对应, 以保证程序运行的准确性。 0110 例如, 该事件所对应的数据可采用epoll_event.data这一数据结构, 包含了64位 字段, 其中, 头 32 位字段用于保存验证信息, 后 32 位保存了位置下标。 0111 步骤 S133a, 查找胶合层中已使用链表得到位置信息对应的节点。 0112 本实施例中, 根据解析得到的位置信息进行在已使用链表中进行查找, 以得到相 应的节点, 该节点中存储于当前触发的事件所对应的事件处理对象。 0113 步骤 S135a, 通过验证信息验证查找得到的节点与该事件是否匹配,。
36、 若是, 则进入 步骤 S137a, 若否, 则结束。 0114 本实施例中, 节点在保存事件处理对象时, 还保存了唯一的序列信息, 节点中的数 组下标即为该节点的位置。因此, 根据解析得到的位置信息查看得到数组下标与该位置信 息相一致的节点, 进而读取节点中保存的序列信息, 将该序列信息与解析得到的验证信息 进行比较, 判断是否一致, 若是, 则验证通过, 可应用该节点所存储的事件处理对象对当前 触发的事件进行响应。 0115 步骤 S137a, 获取存储于节点中的事件处理对象。 0116 本实施例中, 从查找得到的节点中获取存储于其中的事件处理对象, 以应用该事 件处理对象处理当前所触发的。
37、事件。 0117 上述事件的分发和事件处理对象的获取中, 通过验证信息进行对事件处理对象进 行二次确认, 在高并发情况下, 尤其是在海量客户端连接的情况下, 存储了事件处理对象的 节点出现句柄重叠的情况时有发生, 即某一客户端可能会由于异常情况还未处理完成当前 的事件就被新连接的另一客户端所覆盖, 进而造成了事件处理对象中的句柄重叠, 实际上, 此时该节点所存储的事件处理对象并不是查找得到的事件处理对象, 是与当前的事件不对 应的, 因此, 通过验证信息所进行的二次确认将能够防止应用覆盖的事件处理对象处理当 前事件, 保证了运行的准确性。 0118 在一个实施例中, 上述步骤 S150 的具体。
38、过程为 : 通过位于胶合层的事件处理对象 调用 Lua 接口层中相应的接口函数, 通过该接口函数触发 Lua 脚本处理事件。 0119 本实施例中, 服务器引擎中的胶合层还将注册相关函数到 Lua 应用层, 以通过调 说 明 书 CN 104281488 A 10 7/15 页 11 用相关的 Lua 接口函数来通知 Lua 脚本处理当前触发的事件。 0120 进一步的, 请参阅图2, 服务器引擎中的胶合层包括了C+胶合层和Lua接口层, 其 中, C+ 胶合层将实现了事件的分发和事件处理对象的获取, Lua 接口层则为 Lua 应用层提 供了接入胶合层, 即 C+ 主程序的接口。 0121 。
39、由于得到的事件处理对象中的数据结构是以 C+ 语言的形式存在, 对于 Lua 应用 层而言, 是无法直接调用的, 需要对其进行数据结构的转换, 以将以 C+ 语言的形式存在的 数据结构转换为以 Lua 语言的形式存在的数据结构。 0122 因此, 预先设备了映射表, 其中, 映射表记录了以 C+ 语言的形式实现的事件处理 对象和相应的 Lua 语言的形式实现的事件处理对象之间的映射关系。通过设定的映射表将 得到的事件处理对象中的数据结构进行转换, 以转换为 Lua 语言实现的事件处理对象, 进 而查找得到 Lua 接口层中与转换后的事件处理对象所对应的 Lua 接口函数, 以调用 Lua 接 。
40、口函数在 Lua 应用层中触发事件, 调用 Lua 脚本中的函数处理该事件。 0123 其中, 由于 C+ 胶合层是通过 C+ 语言实现的, 而 Lua 应用层是通过 Lua 语言实现 的, 所实现的语言不同, 因此无法直接调用 Lua 脚本, 需要通过映射对应用 C+ 语言编写的 数据结构进行转换该可访问 Lua 脚本中的函数。 0124 在一个实施例中, 上述步骤 S130 之前, 该方法还包括从设定的定时器事件中获取 即将到期的最小时间的步骤。 0125 本实施例中, 服务器引擎运行的过程中常常设定了若干个定时器事件, 因此从设 定的若干个定时器事件中获取即将到期的最小时间。 0126 。
41、如图 6 所示, 在一个实施例中, 上述步骤 S110 包括 : 0127 步骤 S111, 以获取的最小时间作为事件监听的超时值, 开启事件监听, 并通过网络 事件的触发或超时停止当前的事件监听得到当前触发的网络事件或定时器事件。 0128 本实施例中, 服务器引擎中进行的事件监听是循环进行的, 在获取到定时器事件 中即将到期的最小时间之后, 将这一最小时间作为事件监听的超时值, 即当前所开始的新 一轮监听所对应的超时值。 0129 进一步的, 在设置了事件监听的超时值之后, 反应器对象开始新一轮监听, 待反应 器对象通知网络事件被触发或者超时之后将进行网络事件的处理然后紧接着处理定时器 事。
42、件, 或者处理定时器事件。该反应器对象即为 Reactor 对象, 处于网络通讯层中。 0130 步骤 S113, 判断网络事件是否被触发, 若是, 则进入步骤 S210, 若否, 则进入步骤 S130。 0131 本实施例中, 当前所进行的事件监听停止之后, 将判断使得当前所进行的事件监 听停止的原因是否为网络事件的触发, 若是, 则进入步骤 S210 进行网络事件的处理, 若否, 则说明定时器事件被触发, 因此, 需要进入步骤 S130 分发定时器事件, 以处理该定时器事 件。 0132 如图 7 所示, 在一个实施例中, 上述步骤 S130 还包括 : 0133 步骤 S131b, 依次。
43、检查每一定时器链表, 在定时器链表中按照添加定时器事件处理 对象的先后顺序依次判断定时器事件处理对象是否到期, 若是, 则进入步骤 S133b, 若否, 则 返回步骤 S310。 0134 本实施例中, 若判断到网络事件未被触发, 定时器事件被触发, 则依次检查每一个 说 明 书 CN 104281488 A 11 8/15 页 12 定时器链表, 按照定时器事件处理对象添加至定时器链表的先后顺序检查是否到期, 若所 检查的第一个定时器事件处理对象未到期, 则可直接停止检查, 直接进入步骤 S310, 若否, 则将获取得到到期的定时器事件处理对象, 并响应。 0135 由于定时器事件处理对象是。
44、按照时间的先后顺序添加到定时器链表中的, 第一个 定时器事件处理对象将是最早到期的, 因此, 若检查得到第一个定时器事件处理对象未到 期, 则不必须再进行检查, 以节省系统资源。 0136 若判断到网络事件被触发, 且网络事件被处理完毕之后将进入上述依次检查每一 定时器链表的步骤, 进而使得服务器引擎中网络事件和定时器事件的处理得到了统一, 提 高了运行的精确性。 0137 步骤 S133b, 获取到期的定时器事件处理对象。 0138 本实施例中, 从定时器链表中获取到期的定时器事件处理对象, 以通过位于胶合 层的定时器事件处理对象调用 Lua 脚本进行响应。 0139 步骤 S310, 从设。
45、定的定时器事件中获取即将到期的最小时间。 0140 在一个实施例中, 定时器链表用于装载所有的定时器任务, 用于存储定时器事件 处理对象, 进而通过定时器事件处理对象完成设定的定时器任务。 0141 进一步的, 定时器链表是由多个双向链表组成的, 每一双向链表中的定时器事件 处理对象都将是与同一时间类型对应的。例如, 如图 8 所示, 定时器链表中包括了 5 个双向 链表, 其中, 第一个双向链表是与 1S 的时间类型相对应的, 第一个双向链表中的定时器事 件处理对象所设定的定时时间均为 1S ; 第二个双向链表是与 2S 的时间类型相对应的, 第二 个双向链表的定时器事件处理对象所设定的定时。
46、时间均为 2S, 依此类推, 定时器链表中的 双向链表是依据其时间类型设定的。 0142 相应的, 定时器链表中定时器事件处理对象的添加只需要根据时间类型进行遍历 以找到时间类型相同的双向链表, 将该定时器事件处理对象添加至链表尾部即可 ; 定时器 事件处理对象的删除将直接删除相应的节点, 并连接前后节点即可, 定时器链表中双向链 表的设置将大大地降低了添加定时器事件处理对象和删除定时器事件处理对象的时间复 杂度, 提高了效率。 0143 在一个实施例中, 服务器引擎根据应用逻辑的开发需要常常需要进行定时器事件 处理对象的创建, 并开启创建的定时器事件处理对象, 进而触发执行定时器事件处理对象。
47、, 以完成应用逻辑中的定时任务。 0144 参照图 9 所示的原理, 开发人员可通过在 Lua 应用层调用定时器类的构造函数调 用Lua接口层中定义的Lua函数, 即C+胶合层所注册的Lua接口函数create_timer, 这一 Lua接口函数将对应了C+胶合层中的tolua_interface_timer_creater_timer00函数, 此 时, tolua_interface_timer_creater_timer00 函数中会新建出一个定时器事件处理对象, 并分配唯一标识 index。以唯一标识 index 为 key, 以定时器事件处理对象为 value 进行存 储, 并将该定。
48、时器事件处理对象的唯一标识index返回给Lua应用层, 进而完成了定时器事 件处理对象的创建。 0145 在需要开启创建的定时器事件处理对象时, 将传入相应的参数, 例如间隔时 间 (inteval)和是否循环执行 (isloop) , 此时, 将调用 Lua 接口层中定义的函数, 例如 StartTimer 函数, 此时, 通过 Lua 接口层中定义的函数将调用 C+ 胶合层所注册的函数, 并 说 明 书 CN 104281488 A 12 9/15 页 13 将定时器事件处理对象的唯一标识 index、 间隔时间和是否循环执行等作为参数传递。 0146 根据传递的唯一标识在 C+ 胶合层中查找相应的定时器事件处理对象, 并将传入 的间隔时间和是否循环执行这两个参数赋予该定时器事件处理对象, 以完成定时器事件处 理对象的开启。 0147 开启了定时器事件处理对象之后, 将在定时器链表中添加该定时器事件处理 对象的检测, 以待该定时器事件处理对象到期之后调用该定时器事件处理对象中的 ProceessOnTimerOut方法, 通过ProceessOnTimerOut方法根据唯一标识调用Lua接口层所 定义的接口函数, 通过调用的 Lua 接口层所定义的接口函数根据唯一标识 index 查找 Lua 应用层中的对象, 触发 Lua 应用层中的 Lua 脚本处理。