美文网首页游戏编程研究院
服务器编程(状态)

服务器编程(状态)

作者: Godan | 来源:发表于2018-12-16 15:40 被阅读1次
传统模式:蓝色-判断 绿色-消息处理 红色-错误处理

图中上方的3个判断,从左到右逐步叠加,至最后“坐下人数是否满足开始条件”时,需要先判断“是否登录”、“是否在房间”。如果采用公共判断函数,也最好将每个判断独立出来,并在每个消息处理函数里叠加使用。

通常多个消息处理需要同样的条件判断。我们可以把这些共有的判断封装到一些函数里。

// 公共判断函数

// 是否登录
function isLogin(){}
// 是否在房间
function isInRoom(){}
// 坐下人数是否满足开始条件
function isCanStart(){}

当实现上图底部的消息请求处理函数时,会用到这些公共判断函数。如果,某个消息请求处理函数漏掉其中一个判断,就有可能造就利用它的外挂,并且这样的疏忽在编程阶段难以体现出来,而利用严格完备的单元测试和代码review,来检查这样的漏洞势必花费大量的精力。

// 假如获取房间里玩家信息消息请求处理函数
// 漏掉isInRoom()是否在房间的判断
// 那么就可以制作一种外挂获得每个房间里当前玩家信息

// 更糟糕的是,游戏时没有检查玩家是否在房间中
// 外挂模拟的客户端直接加入到游戏中,成为
// 其他玩家无法感知的幽灵玩家
// 外挂模拟的玩家,由于其数据的不完备
// 可能让服务器异常,破坏结算的一致性

看来需要一些更好的手段,最好在开发时就规避这样的风险,像红外对射传感器般,在有人阻断对射时立刻发出报警。

状态模式:紫色-状态 蓝色-判断 绿色-消息处理 红色-错误处理

状态模式中,增加状态的概念(紫色),希望明确的区分每个请求消息属于哪个状态,并且需要满足哪个必备条件(状态右上方的判断)。

每个状态有一个必备条件,支持处理一种或多种消息请求。

// 状态需要实现的方法

// 每个状态拥有独一无二的名称或ID
function name() {}
// 每个状态都有一个必备条件
function isEnough(playerData)  {}

// 每个状态有一个或多个消息请求处理函数
function handleXXXMsg(msg) {}

// 注册消息请求处理函数到某个状态
states.register(stateN, handleXXXMsg)
// ...

你必须先实现状态必备条件isEnough(playerData)方法,并给它安排一个恰当的顺序,否则消息处理就会失败,这样在开发周期中问题就必备条件检测问题立刻暴露出来。

将这个4个状态按顺序存放,玩家的每次请求,都一次拿状态的必备条件去检测,一旦请求满足某个条件后,就认为玩家属于这个条件对应的状态(叠加的判断)。然后尝试分发到这个状态支持的消息请求处理(分隔消息处理),分发失败则丢弃。

// 自动更新玩家状态,处理消息请求前或后执行
function autoChangePlayerState(player) {
  var find = false
  for (n = 0; n < states.length; n++) {
    if (states[n].isEnough(player.data)) {
      player.setState(state)
      find = true
      break
    }
  }
  if (!find) {
    console.error("没有为玩家", player.id, "指定正确的状态")
  }
}

// 处理客户端请求
function onClientRequest(player, msg) {
  autoChangePlayerState(player)
  player.currentState().process(msg)
}

// 处理请求,玩家的成员方法
function process(msg) {
  handle = this.handlers[msg.name]
  if (!handle) {
    console.log("无法处理消息", msg.name)
    return
  }

  // 调用处理函数
  handle(msg)
}

相关文章

  • 服务器编程(状态)

    图中上方的3个判断,从左到右逐步叠加,至最后“坐下人数是否满足开始条件”时,需要先判断“是否登录”、“是否在房间”...

  • Shell脚本自动检测HTTP状态

    编程需求说明: 监控web服务器运行状态的方式有很多种,最简单的就是监控该服务器是否宕机,客户端是否无法访问.Pi...

  • Shell脚本检测HTTP服务状态

    编程需求: 在项目有web服务器的时候,监控服务器的状态是非常重要的一项任务,虽然可以通过手动执行命令来进行检测,...

  • golang的线程模型——GMP模型

    常见的线程模型 单线程服务器编程模型:Redis、Node.、JavaScript 多线程服务器编程模型:并发多个...

  • python 百天学习之十四天 :TCP/UDP 服务器和客户端

    练习1:TCP 服务器/客户端编程 TCP 服务端 TCP 客户端 练习2:UDP 服务器/客户端编程 UDP 服...

  • Flink 状态编程

    1.流式计算分为无状态和有状态两种情况。无状态的计算观察每个独立事件,并根据最后一个事件输出结果。例如,流处理应用...

  • Flink状态编程

    介绍 有状态的计算是流处理框架要实现的重要功能,因为稍复杂的流处理场景都需要记录状态,然后在新流入数据的基础上不断...

  • 千锋的第十七天

    一、scoketServer(创建服务器) 1.创建服务器scoket编程对象server = socket.so...

  • 2020-06-09日志

    服务器端编程介绍 大多数的大型网站采用服务器端编程来在需要的时候动态展示不同的信息,这些信息通常会从服务器上的数据...

  • Combine 基础知识

    摘自《SwiftUI和Combine编程》---《Combine异步编程》 响应式异步编程模型 将“状态变化”看作...

网友评论

    本文标题:服务器编程(状态)

    本文链接:https://www.haomeiwen.com/subject/onztkqtx.html