精华内容
下载资源
问答
  • 他们知道如何通过JavaScript与Web应用程序的前端,后端和服务器端(“完整堆栈”)一起工作。 JavaScript增强了每个主要网站上的交互性和用户体验。 从提供更丰富的桌面式体验的用户界面到实时数据和消息传递应用...
  • 用于处理路由HTTP请求的服务器 jwt-验证JWT进行身份验证的中间件 用于生成身份验证使用的JWT 用于将MongoDB数据建模映射到javascript 用于处理Mongoose中的唯一验证错误。 Mongoose仅在文档级别处理验证,...
  • 【游戏后端】游戏服务器端开发的一些建议 摘要: 本文作为游戏服务器端开发的基本大纲,是游戏实践开发中的总结。第一部分专业基础,用于指导招聘实习考核, 第二部分游戏入门,讲述游戏服务器端开发的基本要点,...

    【游戏后端】游戏服务器端开发的一些建议

    摘要: 本文作为游戏服务器端开发的基本大纲,是游戏实践开发中的总结。第一部分专业基础,用于指导招聘和实习考核, 第二部分游戏入门,讲述游戏服务器端开发的基本要点,第三部分服务端架构,介绍架构设计中的一些基本原则。希望能帮到大家

    一 专业基础

    1.1 网络

    1.1.1 理解TCP/IP协议

    网络传输模型

    滑动窗口技术

    建立连接的三次握手与断开连接的四次握手

    连接建立与断开过程中的各种状态

    TCP/IP协议的传输效率

    思考

    1)请解释DOS攻击与DRDOS攻击的基本原理

    2)一个100Byte数据包,精简到50Byte, 其传输效率提高了50%

    3)TIMEWAIT状态怎么解释?

    1.1.2 掌握常用的网络通信模型

    Select

    Epoll,边缘触发与平台出发点区别与应用

    Select与Epoll的区别及应用

    1.2 存储

    计算机系统存储体系

    程序运行时的内存结构

    计算机文件系统,页表结构

    内存池与对象池的实现原理,应用场景与区别

    关系数据库MySQL的使用

    共享内存

    1.3 程序

    对C/C++语言有较深的理解

    深刻理解接口,封装与多态,并且有实践经验

    深刻理解常用的数据结构:数组,链表,二叉树,哈希表

    熟悉常用的算法及相关复杂度:冒泡排序,快速排序

    二 游戏开发入门

    2.1防御式编程

    不要相信客户端数据,一定要检验。作为服务器端你无法确定你的客户端是谁,你也不能假定它是善意的,请做好自我保护。(这是判断一个服务器端程序员是否入门的基本标准)

    务必对于函数的传人参数和返回值进行合法性判断,内部子系统,功能模块之间不要太过信任,要求低耦合,高内聚

    插件式的模块设计,模块功能的健壮性应该是内建的,尽量减少模块间耦合

    2.2 设计模式

    道法自然。不要迷信,迷恋设计模式,更不要生搬硬套

    简化,简化,再简化,用最简单的办法解决问题

    借大宝一句话:设计本天成,妙手偶得之

    2.3 网络模型

    自造轮子: Select, Epoll, Epoll一定比Select高效吗?

    开源框架: Libevent, libev, ACE

    2.4 数据持久化

    自定义文件存储,如《梦幻西游》

    关系数据库: MySQL

    NO-SQL数据库: MongoDB

    选择存储系统要考虑到因素:稳定性,性能,可扩展性

    2.5 内存管理

    使用内存池和对象池,禁止运行期间动态分配内存

    对于输入输出的指针参数,严格检查,宁滥勿缺

    写内存保护。使用带内存保护的函数(strncpy, memcpy, snprintf, vsnprintf等),严防数组下标越界

    防止读内存溢出,确保字符串以’\0’结束

    2.6 日志系统

    简单高效,大量日志操作不应该影响程序性能

    稳定,做到服务器崩溃是日志不丢失

    完备,玩家关键操作一定要记日志,理想的情况是通过日志能重建任何时刻的玩家数据

    开关,开发日志的要加级别开关控制

    2.7 通信协议

    采用PDL(Protocol Design Language), 如Protobuf,可以同时生成前后端代码,减少前后端协议联调成本, 扩展性好

    JSON,文本协议,简单,自解释,无联调成本,扩展性好,也很方便进行包过滤以及写日志

    自定义二进制协议,精简,有高效的传输性能,完全可控,几乎无扩展性

    2.8 全局唯一Key(GUID)

    为合服做准备

    方便追踪道具,装备流向

    每个角色,装备,道具都应对应有全局唯一Key

    2.9 多线程与同步

    消息队列进行同步化处理

    2.10 状态机

    强化角色的状态

    前置状态的检查校验

    2.11 数据包操作

    合并, 同一帧内的数据包进行合并,减少IO操作次数

    单副本, 用一个包尽量只保存一份,减少内存复制次数

    AOI同步中减少中间过程无用数据包

    2.12 状态监控

    随时监控服务器内部状态

    内存池,对象池使用情况

    帧处理时间

    网络IO

    包处理性能

    各种业务逻辑的处理次数

    2.13 包频率控制

    基于每个玩家每条协议的包频率控制,瘫痪变速齿轮

    2.14 开关控制

    每个模块都有开关,可以紧急关闭任何出问题的功能模块

    包频率控制可以消灭变速齿轮

    包id自增校验,可以消灭WPE

    包校验码可以消灭包拦截篡改

    图形识别吗,可以踢掉99%非人的操作

    魔高一尺,道高一丈

    2.16 热更新

    核心配置逻辑的热更新,如防沉迷系统,包频率控制,开关控制等

    代码基本热更新,如Erlang,Lua等

    2.17 防刷

    关键系统资源(如元宝,精力值,道具,装备等)的产出记日志

    资源的产出和消耗尽量依赖两个或以上的独立条件的检测

    严格检查各项操作的前置条件

    校验参数合法性

    2.18 防崩溃

    系统底层与具体业务逻辑无关,可以用大量的机器人压力测试暴露各种bug,确保稳定

    业务逻辑建议使用脚本

    系统性的保证游戏不会崩溃

    2.19 性能优化

    IO操作异步化

    IO操作合并缓写 (事务性的提交db操作,包合并,文件日志缓写)

    Cache机制

    减少竞态条件 (避免频繁进出切换,尽量减少锁定使用,多线程不一定由于单线程) 多线程不一定比单线程快

    减少内存复制

    自己测试,用数据说话,别猜

    2.20 运营支持

    接口支持:实时查询,控制指令,数据监控,客服处理等

    实现考虑提供Http接口

    2.21 容灾与故障预案

    三 服务器端架构

    3.1 什么是好的架构?

    满足业务要求

    能迅速的实现策划需求,响应需求变更

    系统级的稳定性保障

    简化开发。将复杂性控制在架构底层,降低对开发人员的技术要求,逻辑开发不依赖于开发人员本身强大的技术实力,提高开发效率

    完善的运营支撑体系

    3.2 架构实践的思考

    简单,满足需求的架构就是好架构

    设计性能,抓住重要的20%, 没必要从程序代码里面去抠性能

    热更新是必须的

    人难免会犯错,尽可能的用一套机制去保障逻辑的健壮性

    游戏服务器的设计是一项颇有挑战性的工作,游戏服务器的发展也由以前的单服结构转变为多服机构,甚至出现了bigworld引擎的分布式解决方案,最近了解到Unreal的服务器解决方案atlas也是基于集群的方式。

    负载均衡是一个很复杂的课题,这里暂不谈bigworld和atlas的这类服务器的设计,更多的是基于功能和场景划分服务器结构。

    首先说一下思路,服务器划分基于以下原则:

    1. 分离游戏中占用系统资源(cpu,内存,IO等)较多的功能,独立成服务器。
    2. 在同一服务器架构下的不同游戏,应尽可能的复用某些服务器(进程级别的复用)。
    3. 以多线程并发的编程方式适应多核处理器。
    4. 宁可在服务器之间多复制数据,也要保持清晰的数据流向。
    5. 主要按照场景划分进程,若需按功能划分,必须保持整个逻辑足够的简单,并满足以上1,2点。

    服务器结构图:

    各个服务器的简要说明:

    Gateway 是应用网关,主要用于保持和client的连接,该服务器需要2种IO,对client采用高并发连接,低吞吐量的网络模型,如IOCP等,对服务器采用高吞吐量连接,如阻塞或异步IO。

    网关主要有以下用途:

    1. 分担了网络IO资源
    2. 同时,也分担了网络消息包的加解密,压缩解压等cpu密集的操作。
    3. 隔离了client和内部服务器组,对client来说,它只需要知道网关的相关信息即可(ip和port)。
    4. client由于一直和网关保持常连接,所以切换场景服务器等操作对client来说是透明的。
    5. 维护玩家登录状态。

    World Server 是一个控制中心,它负责把各种计算资源分布到各个服务器,它具有以下职责:

    1. 管理和维护多个Scene Server。
    2. 管理和维护多个功能服务器,主要是同步数据到功能服务器。
    3. 复杂转发其他服务器和Gateway之间的数据。
    4. 实现其他需要跨场景的功能,如组队,聊天,帮派等。

    Phys Server 主要用于玩家移动,碰撞等检测。

    所有玩家的移动类操作都在该服务器上做检查,所以该服务器本身具备所有地图的地形等相关信息。具体检查过程是这样的:首先,Worldserver收到一个移动信息,WorldServer收到后向Phys Server请求检查,Phys Server检查成功后再返回给world Server,然后world server传递给相应的Scene Server。

    Scene Server 场景服务器,按场景划分,每个服务器负责的场景应该是可以配置的。理想情况下是可以动态调节的。

    ItemMgr Server 物品管理服务器,负责所有物品的生产过程。在该服务器上存储一个物品掉落数据库,服务器初始化的时候载入到内存。任何需要产生物品的服务器均与该服务器直接通信。

    AIServer 又一个功能服务器,负责管理所有NPC的AI。AI服务器通常有2个输入,一个是Scene Server发送过来的玩家相关操作信息,另一个时钟Timer驱动,在这个设计中,对其他服务器来说,AIServer就是一个拥有很多个NPC的客户端。AIserver需要同步所有与AI相关的数据,包括很多玩家数据。由于AIServer的Timer驱动特性,可在很大程度上使用TBB程序库来发挥多核的性能。

    把网络游戏服务器分拆成多个进程,分开部署。这种设计的好处是模块自然分离,可以单独设计。分担负荷,可以提高整个系统的承载能力。

    缺点在于,网络环境并不那么可靠。跨进程通讯有一定的不可预知性。服务器间通讯往往难以架设调试环境,并很容易把事情搅成一团糨糊。而且正确高效的管理多连接,对程序员来说也是一项挑战。

    前些年,我也曾写过好几篇与之相关的设计。这几天在思考一个问题:如果我们要做一个底层通用模块,让后续开发更为方便。到底要解决怎样的需求。这个需求应该是单一且基础的,每个应用都需要的。

    正如 TCP 协议解决了互联网上稳定可靠的点对点数据流通讯一样。游戏世界实际需要的是一个稳定可靠的在游戏系统内的点对点通讯需要。

    我们可以在一条 TCP 连接之上做到这一点。一旦实现,可以给游戏服务的开发带来极大的方便。

    可以把游戏系统内的各项服务,包括并不限于登陆,拍卖,战斗场景,数据服务,等等独立服务看成网络上的若干终端。每个玩家也可以是一个独立终端。它们一起构成一个网络。在这个网络之上,终端之间可以进行可靠的连接和通讯。

    实现可以是这样的:每个虚拟终端都在游戏虚拟网络(Game Network)上有一个唯一地址 (Game Network Address , GNA) 。这个地址可以预先设定,也可以动态分配。每个终端都可以通过游戏网络的若干接入点 ( GNAP ) 通过唯一一条 TCP 连接接入网络。接入过程需要通过鉴权。

    鉴权过程依赖内部的安全机制,可以包括密码证书,或是特别的接入点区分。(例如,玩家接入网络就需要特定的接入点,这个接入点接入的终端都一定是玩家)

    鉴权通过后,网络为终端分配一个固定的游戏域名。例如,玩家进入会分配到 player.12345 这样的域名,数据库接入可能分配到 database 。

    游戏网络默认提供一个域名查询服务(这个服务可以通过鉴权的过程注册到网络中),让每个终端都能通过域名查询到对应的地址。

    然后,游戏网络里所有合法接入的终端都可以通过其地址相互发起连接并通讯了。整个协议建立在 TCP 协议之上,工作于唯一的这个 TCP 连接上。和直接使用 TCP 连接不同。游戏网络中每个终端之间相互发起连接都是可靠的。不仅玩家可以向某个服务发起连接,反过来也是可以的。玩家之间的直接连接也是可行的(是否允许这样,取决于具体设计)。

    由于每个虚拟连接都是建立在单一的 TCP 连接之上。所以减少了互连网上发起 TCP 连接的各种不可靠性。鉴权过程也是一次性唯一的。并且我们提供域名反查服务,我们的游戏服务可以清楚且安全的知道连接过来的是谁。

    系统可以设计为,游戏网络上每个终端离网,域名服务将广播这条消息,通知所有人。这种广播服务在互联网上难以做到,但无论是广播还是组播,在这个虚拟游戏网络中都是可行的。

    在这种设计上。在逻辑层面,我们可以让玩家直接把聊天信息从玩家客互端发送到聊天服务器,而不需要建立多余的 TCP 连接,也不需要对转发处理聊天消息做多余的处理。聊天服务器可以独立的存在于游戏网络。也可以让广播服务主动向玩家推送消息,由服务器向玩家发起连接,而不是所有连接请求都是由玩家客互端发起。

    虚拟游戏网络的构成是一个独立的层次,完全可以撇开具体游戏逻辑来实现,并能够单独去按承载量考虑具体设计方案。非常利于剥离出具体游戏项目来开发并优化。

    最终,我们或许需要的一套 C 库,用于游戏网络内的通讯。api 可以和 socket api 类似。额外多两条接入与离开游戏网络即可。

    posted @ 2019-05-10 22:06 进击的仓鼠 阅读(...) 评论(...) 编辑 收藏

    展开全文
  • RiceDB-服务器 #安装 pip3 install -r requirements.txt ./test.sh sqlite3 rice.db .read schema.sql
  • 【游戏后端】游戏服务器端开发的一些建议(转载) 摘要: 本文作为游戏服务器端开发的基本大纲,是游戏实践开发中的总结。第一部分专业基础,用于指导招聘实习考核, 第二部分游戏入门,讲述游戏服务器端开发的基本...

    【游戏后端】游戏服务器端开发的一些建议(转载)

    摘要: 本文作为游戏服务器端开发的基本大纲,是游戏实践开发中的总结。第一部分专业基础,用于指导招聘和实习考核, 第二部分游戏入门,讲述游戏服务器端开发的基本要点,第三部分服务端架构,介绍架构设计中的一些基本原则。希望能帮到大家

    一 专业基础

    1.1 网络

    1.1.1 理解TCP/IP协议

    网络传输模型
    滑动窗口技术
    建立连接的三次握手与断开连接的四次握手
    连接建立与断开过程中的各种状态
    TCP/IP协议的传输效率
    思考

    1)请解释DOS攻击与DRDOS攻击的基本原理
    2)一个100Byte数据包,精简到50Byte, 其传输效率提高了50%
    3)TIMEWAIT状态怎么解释?

    1.1.2 掌握常用的网络通信模型

    Select
    Epoll,边缘触发与平台出发点区别与应用
    Select与Epoll的区别及应用

    1.2 存储

    计算机系统存储体系
    程序运行时的内存结构
    计算机文件系统,页表结构
    内存池与对象池的实现原理,应用场景与区别
    关系数据库MySQL的使用
    共享内存

    1.3 程序

    对C/C++语言有较深的理解
    深刻理解接口,封装与多态,并且有实践经验
    深刻理解常用的数据结构:数组,链表,二叉树,哈希表
    熟悉常用的算法及相关复杂度:冒泡排序,快速排序

    二 游戏开发入门

    2.1防御式编程

    不要相信客户端数据,一定要检验。作为服务器端你无法确定你的客户端是谁,你也不能假定它是善意的,请做好自我保护。(这是判断一个服务器端程序员是否入门的基本标准)
    务必对于函数的传人参数和返回值进行合法性判断,内部子系统,功能模块之间不要太过信任,要求低耦合,高内聚
    插件式的模块设计,模块功能的健壮性应该是内建的,尽量减少模块间耦合

    2.2 设计模式

    道法自然。不要迷信,迷恋设计模式,更不要生搬硬套
    简化,简化,再简化,用最简单的办法解决问题
    借大宝一句话:设计本天成,妙手偶得之

    2.3 网络模型

    自造轮子: Select, Epoll, Epoll一定比Select高效吗?
    开源框架: Libevent, libev, ACE

    2.4 数据持久化

    自定义文件存储,如《梦幻西游》
    关系数据库: MySQL
    NO-SQL数据库: MongoDB
    选择存储系统要考虑到因素:稳定性,性能,可扩展性

    2.5 内存管理

    使用内存池和对象池,禁止运行期间动态分配内存
    对于输入输出的指针参数,严格检查,宁滥勿缺
    写内存保护。使用带内存保护的函数(strncpy, memcpy, snprintf, vsnprintf等),严防数组下标越界
    防止读内存溢出,确保字符串以’\0’结束

    2.6 日志系统

    简单高效,大量日志操作不应该影响程序性能
    稳定,做到服务器崩溃是日志不丢失
    完备,玩家关键操作一定要记日志,理想的情况是通过日志能重建任何时刻的玩家数据
    开关,开发日志的要加级别开关控制

    2.7 通信协议

    采用PDL(Protocol Design Language), 如Protobuf,可以同时生成前后端代码,减少前后端协议联调成本, 扩展性好
    JSON,文本协议,简单,自解释,无联调成本,扩展性好,也很方便进行包过滤以及写日志
    自定义二进制协议,精简,有高效的传输性能,完全可控,几乎无扩展性

    2.8 全局唯一Key(GUID)

    为合服做准备
    方便追踪道具,装备流向
    每个角色,装备,道具都应对应有全局唯一Key

    2.9 多线程与同步

    消息队列进行同步化处理

    2.10 状态机

    强化角色的状态
    前置状态的检查校验

    2.11 数据包操作

    合并, 同一帧内的数据包进行合并,减少IO操作次数
    单副本, 用一个包尽量只保存一份,减少内存复制次数
    AOI同步中减少中间过程无用数据包

    2.12 状态监控

    随时监控服务器内部状态
    内存池,对象池使用情况
    帧处理时间
    网络IO
    包处理性能
    各种业务逻辑的处理次数

    2.13 包频率控制

    基于每个玩家每条协议的包频率控制,瘫痪变速齿轮

    2.14 开关控制

    每个模块都有开关,可以紧急关闭任何出问题的功能模块
    包频率控制可以消灭变速齿轮
    包id自增校验,可以消灭WPE
    包校验码可以消灭包拦截篡改
    图形识别吗,可以踢掉99%非人的操作
    魔高一尺,道高一丈

    2.16 热更新

    核心配置逻辑的热更新,如防沉迷系统,包频率控制,开关控制等
    代码基本热更新,如Erlang,Lua等

    2.17 防刷

    关键系统资源(如元宝,精力值,道具,装备等)的产出记日志
    资源的产出和消耗尽量依赖两个或以上的独立条件的检测
    严格检查各项操作的前置条件
    校验参数合法性

    2.18 防崩溃

    系统底层与具体业务逻辑无关,可以用大量的机器人压力测试暴露各种bug,确保稳定
    业务逻辑建议使用脚本
    系统性的保证游戏不会崩溃

    2.19 性能优化

    IO操作异步化
    IO操作合并缓写 (事务性的提交db操作,包合并,文件日志缓写)
    Cache机制
    减少竞态条件 (避免频繁进出切换,尽量减少锁定使用,多线程不一定由于单线程) 多线程不一定比单线程快
    减少内存复制
    自己测试,用数据说话,别猜

    2.20 运营支持

    接口支持:实时查询,控制指令,数据监控,客服处理等
    实现考虑提供Http接口

    2.21 容灾与故障预案

    三 服务器端架构

    3.1 什么是好的架构?

    满足业务要求
    能迅速的实现策划需求,响应需求变更
    系统级的稳定性保障
    简化开发。将复杂性控制在架构底层,降低对开发人员的技术要求,逻辑开发不依赖于开发人员本身强大的技术实力,提高开发效率
    完善的运营支撑体系

    3.2 架构实践的思考

    简单,满足需求的架构就是好架构
    设计性能,抓住重要的20%, 没必要从程序代码里面去抠性能
    热更新是必须的
    人难免会犯错,尽可能的用一套机制去保障逻辑的健壮性
    游戏服务器的设计是一项颇有挑战性的工作,游戏服务器的发展也由以前的单服结构转变为多服机构,甚至出现了bigworld引擎的分布式解决方案,最近了解到Unreal的服务器解决方案atlas也是基于集群的方式。

    负载均衡是一个很复杂的课题,这里暂不谈bigworld和atlas的这类服务器的设计,更多的是基于功能和场景划分服务器结构。

    首先说一下思路,服务器划分基于以下原则:

    分离游戏中占用系统资源(cpu,内存,IO等)较多的功能,独立成服务器。
    在同一服务器架构下的不同游戏,应尽可能的复用某些服务器(进程级别的复用)。
    以多线程并发的编程方式适应多核处理器。
    宁可在服务器之间多复制数据,也要保持清晰的数据流向。
    主要按照场景划分进程,若需按功能划分,必须保持整个逻辑足够的简单,并满足以上1,2点。
    服务器结构图:

    各个服务器的简要说明:

    Gateway 是应用网关,主要用于保持和client的连接,该服务器需要2种IO,对client采用高并发连接,低吞吐量的网络模型,如IOCP等,对服务器采用高吞吐量连接,如阻塞或异步IO。

    网关主要有以下用途:

    分担了网络IO资源
    同时,也分担了网络消息包的加解密,压缩解压等cpu密集的操作。
    隔离了client和内部服务器组,对client来说,它只需要知道网关的相关信息即可(ip和port)。
    client由于一直和网关保持常连接,所以切换场景服务器等操作对client来说是透明的。
    维护玩家登录状态。
    World Server 是一个控制中心,它负责把各种计算资源分布到各个服务器,它具有以下职责:

    管理和维护多个Scene Server。
    管理和维护多个功能服务器,主要是同步数据到功能服务器。
    复杂转发其他服务器和Gateway之间的数据。
    实现其他需要跨场景的功能,如组队,聊天,帮派等。
    Phys Server 主要用于玩家移动,碰撞等检测。

    所有玩家的移动类操作都在该服务器上做检查,所以该服务器本身具备所有地图的地形等相关信息。具体检查过程是这样的:首先,Worldserver收到一个移动信息,WorldServer收到后向Phys Server请求检查,Phys Server检查成功后再返回给world Server,然后world server传递给相应的Scene Server。

    Scene Server 场景服务器,按场景划分,每个服务器负责的场景应该是可以配置的。理想情况下是可以动态调节的。

    ItemMgr Server 物品管理服务器,负责所有物品的生产过程。在该服务器上存储一个物品掉落数据库,服务器初始化的时候载入到内存。任何需要产生物品的服务器均与该服务器直接通信。

    AIServer 又一个功能服务器,负责管理所有NPC的AI。AI服务器通常有2个输入,一个是Scene Server发送过来的玩家相关操作信息,另一个时钟Timer驱动,在这个设计中,对其他服务器来说,AIServer就是一个拥有很多个NPC的客户端。AIserver需要同步所有与AI相关的数据,包括很多玩家数据。由于AIServer的Timer驱动特性,可在很大程度上使用TBB程序库来发挥多核的性能。

    把网络游戏服务器分拆成多个进程,分开部署。这种设计的好处是模块自然分离,可以单独设计。分担负荷,可以提高整个系统的承载能力。

    缺点在于,网络环境并不那么可靠。跨进程通讯有一定的不可预知性。服务器间通讯往往难以架设调试环境,并很容易把事情搅成一团糨糊。而且正确高效的管理多连接,对程序员来说也是一项挑战。

    前些年,我也曾写过好几篇与之相关的设计。这几天在思考一个问题:如果我们要做一个底层通用模块,让后续开发更为方便。到底要解决怎样的需求。这个需求应该是单一且基础的,每个应用都需要的。

    正如 TCP 协议解决了互联网上稳定可靠的点对点数据流通讯一样。游戏世界实际需要的是一个稳定可靠的在游戏系统内的点对点通讯需要。

    我们可以在一条 TCP 连接之上做到这一点。一旦实现,可以给游戏服务的开发带来极大的方便。

    可以把游戏系统内的各项服务,包括并不限于登陆,拍卖,战斗场景,数据服务,等等独立服务看成网络上的若干终端。每个玩家也可以是一个独立终端。它们一起构成一个网络。在这个网络之上,终端之间可以进行可靠的连接和通讯。

    实现可以是这样的:每个虚拟终端都在游戏虚拟网络(Game Network)上有一个唯一地址 (Game Network Address , GNA) 。这个地址可以预先设定,也可以动态分配。每个终端都可以通过游戏网络的若干接入点 ( GNAP ) 通过唯一一条 TCP 连接接入网络。接入过程需要通过鉴权。

    鉴权过程依赖内部的安全机制,可以包括密码证书,或是特别的接入点区分。(例如,玩家接入网络就需要特定的接入点,这个接入点接入的终端都一定是玩家)

    鉴权通过后,网络为终端分配一个固定的游戏域名。例如,玩家进入会分配到 player.12345 这样的域名,数据库接入可能分配到 database 。

    游戏网络默认提供一个域名查询服务(这个服务可以通过鉴权的过程注册到网络中),让每个终端都能通过域名查询到对应的地址。

    然后,游戏网络里所有合法接入的终端都可以通过其地址相互发起连接并通讯了。整个协议建立在 TCP 协议之上,工作于唯一的这个 TCP 连接上。和直接使用 TCP 连接不同。游戏网络中每个终端之间相互发起连接都是可靠的。不仅玩家可以向某个服务发起连接,反过来也是可以的。玩家之间的直接连接也是可行的(是否允许这样,取决于具体设计)。

    由于每个虚拟连接都是建立在单一的 TCP 连接之上。所以减少了互连网上发起 TCP 连接的各种不可靠性。鉴权过程也是一次性唯一的。并且我们提供域名反查服务,我们的游戏服务可以清楚且安全的知道连接过来的是谁。

    系统可以设计为,游戏网络上每个终端离网,域名服务将广播这条消息,通知所有人。这种广播服务在互联网上难以做到,但无论是广播还是组播,在这个虚拟游戏网络中都是可行的。

    在这种设计上。在逻辑层面,我们可以让玩家直接把聊天信息从玩家客互端发送到聊天服务器,而不需要建立多余的 TCP 连接,也不需要对转发处理聊天消息做多余的处理。聊天服务器可以独立的存在于游戏网络。也可以让广播服务主动向玩家推送消息,由服务器向玩家发起连接,而不是所有连接请求都是由玩家客互端发起。

    虚拟游戏网络的构成是一个独立的层次,完全可以撇开具体游戏逻辑来实现,并能够单独去按承载量考虑具体设计方案。非常利于剥离出具体游戏项目来开发并优化。

    最终,我们或许需要的一套 C 库,用于游戏网络内的通讯。api 可以和 socket api 类似。额外多两条接入与离开游戏网络即可。

    展开全文
  • 带有Stream-API后端的轻量级客户端和服务器端日志记录 特征 在浏览器和服务器上均可使用 Node控制台输出和Chrome控制台(带有后备)的主题 与Node和浏览器控制台的接口兼容性,也就是说,您可以用Minilog替换console...
  • 快速提示的服务器端 阶段 项目正在开发中,源代码在dev分支中。 经过开发测试后,代码将被重新建立基础并合并到master分支中。 技术栈 初步框架:Koa.js(以及各个相应中间件) 数据库:Mysql 库: Mysql库:...
  • 安卓和后端服务器数据交互

    千次阅读 2019-12-06 18:44:43
    题外话::其实安卓和后端的数据交互也就相当于网页端和后端的交互一样。后端一样的写接口!传数据的变成了安卓而已!由于公司要求都是写全套的,所以也写了那么一点安卓!手动滑稽!当然博主还停留在Java开发安卓...

    记录一下安卓和后端数据交互吧!数据传输框架OkHttp3

    • 题外话::其实安卓和后端的数据交互也就相当于网页端和后端的交互一样。后端一样的写接口!传数据的变成了安卓端而已!由于公司要求都是写全套的,所以也写了那么一点安卓!手动滑稽!当然博主还停留在Java开发安卓!就来说说数据交互吧!

    1、后端写好接口,postman测试没问题!

    	@RequestMapping("/getallareactrl")
    	@ResponseBody
    	public Result getAllAreaCtrl(@RequestBody ClientRestInfo startRollCallInfo) {
    		logger.info("获取数据 ...");
    		List<AllControl> acList = areaCtrlRecordService.getAllAreaStats(Category.CRIMINAL.getValue());
    		Result result = new Result(ResultType.OK, "");
    		result.getResultMap().put(Constants.ResultKey.DATA_LIST, acList);
    		return result;
    	}
    

    在这里插入图片描述

    2、数据没问题,那我们就需要来安卓端接收了!

    	public void getAreaCtrlInfo(){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    JSONObject param = new JSONObject();
                    param.put(Constants.Param.CLIENT_IP,getPadIP());  // 访问后端接口需要的数据 一个个put进去
                    String url = CommonCode.getPortalUrl(Constants.Portal.GET_ROLL_CALL_DATA);  //后端接口地址
                    JSONObject result = CommonCode.postGetJson(param,url);  //返回的result
                    if (CommonCode.getResultFlag(result)) {
                        JSONArray callInfos = (JSONArray) CommonCode.getResultMapProperty(result, Constants.Param.DATA_LIST);
    				........处理这个result ,把json里的数据提取出了来用
    
    • 来看看获取后端完整访问url的方法:
    	public static String getPortalUrl(String portalname){
    	        String url = "http://" + serverIpPort + portalname;
    	        return url;
    	    }
    
    • serverIpPort根据app的配置的服务器IP获取的。如192.168.2.9:8080
    • 来看看获取数据的OkHttp·方法:
    	public static JSONObject postGetJson(JSONObject param, String url) {
            String resultstr = post(param,url);
            try{
                JSONObject result = JSONObject.parseObject(resultstr);
                return result;
            }catch (Exception e){
                JSONObject failed = new JSONObject();
                failed.put(Constants.Param.RESULT_FLAG,0);
                failed.put(Constants.Param.RESULT_MESSAGE,e.toString());
                return failed;
            }
        }
    

    • 所用均博主实用总结所得,可能不那么权威,也可能有贻误!如有错!还望指正!谢谢!记录一下,积累一点点!
    展开全文
  • 服务器端客户端 技术概述: 服务器端完全设计为在AWS上serverless 。 需要以下知识 打字稿 (带有插件) AWS DynamoDB(主数据库) AWS DynamoDB流 AWS Api网关 AWS Lambda AWS CloudFormation(基础架构作为...
  • 网上商店应用服务器端
  • 在上一篇文章中,介绍了大致的功能界面,这篇文章中重点把主要功能流程走一遍 用户商家订单交互过程: 以界面的形式把上面的流程走一遍

    在上一篇文章中,介绍了大致的功能和界面,这篇文章中重点把主要功能流程走一遍

    用户和商家订单交互过程:


    以界面的形式把上面的流程走一遍

    展开全文
  • 后端渲染和后端路由 后端渲染 以前网页开发都是通过JSP/PHP等进行开发的。JSP即java serve page,用Java写出一个网页,然后把它传到浏览器,让浏览器直接展示这个网页。 当时其实是这样做的。 现在有一个浏览器想...
  • BookYourMark后端 这是BookYourMark网站的后端结构,它管理所有服务器端代码。...在此代码结构中,我使用了诸如NodeJs作为服务器端语言MongoDb作为数据库的技术。 任何建议都是问题,因为该项目处于开发阶段。
  • 完美:服务器端Swift。 Swift开发人员的完美核心工具集框架。 (用于移动后端开发,网站API开发等等)
  • 另外,请记住,这最初是基于前端的,然后转变为后端服务器端生态系统。 最近已将其切换回前端应用程序,因此请记住,会有一些明显的错误/或问题。 这是实验性的。 Geetest自动验证码求解器的用途使用。 当然...
  • 用于后端/服务器端RestFulGraphql APIS应用程序以及MongoDB,MySQL或Firebase作为数据库的Node JsExpress框架。 最近,人们对使用DGraphgRPC进行API通信的图形数据库产生了兴趣。 这个项目是为了展示我在后端...
  • 前台:呈现给用户的视觉基本的操作。 后台:用户浏览网页时,我们看不见的后台数据跑动。 重要概念:后台包括前端,后端。 2. 前端与后端 前端:对应我们写的html 、javascript 等网页语言作用在前端网页。 ...
  • 某大神写的,现在拿出来分享一下 主图 上面这些就是我demo大部分界面 ...我就慢慢写,毕竟我已经把服务器和客户端的源代码都发布了 下载地址:https://qtm.lanzous.com/b00nkhh7a密码:8cdo ...
  • 使用Celestite,您可以在Crystal中编写您的后端服务器代码,在JavaScriptHTML中编写您的前端客户端代码,然后一切都可以无缝且快速地协同工作。 介绍 要求 水晶0.35.1+ 纱线1.12+ 节点10+ 渲染服务器是使用...
  • 这是为JAMstack CMS提供支持的后端基础结构。 如果您想基于JAMstack CMS构建另一个CMS,那么这是一个很好的起点。 它包括以下内容: 带有授权规则的GraphQL API。 Amazon S3,用于存储图像,视频文件。 身份...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,727
精华内容 1,490
关键字:

后端和服务器端