我们游戏项目,刚开始pvp实时战斗,就是最简单的方式:
客户端发协议,服务器转发指令,服务器不会存任何状态,但是假如A发了一条指令,服务器在转发给B的时候,B恰好断了网,未能及时捕捉,那么这条指令就永远丢失了,
当然,B重连回来的时候可以根据A的战场数据来同步自己的战场,不过这种做法对客户端的编程要求挺高,而且客户端要存很多状态,随机数和时序都容易出错,事实上也是如此,
还有一点就是容易在断线是被外挂修改数据。
后面,决定服务器开房间,做个消息队列,专门转发指令,这样首先可以避免,消息量很频繁的时候,不能及时响应,但是最终还是能按顺序逐条转发!
同时这个房间还会存下客户端发送的所有指令,这时候假如一方掉线了,这时候服务器存的整场战斗指令[1,2,3,4,5],但是指令5发送没成功,重连回来的时候:
1.假如是在战场中重连回来,那么掉线一方的客户端会存有整场战斗的指令[1,2,3,4],这时候服务器给他推送[1,2,3,4,5],他仅仅只需要恢复指令5就行了。
2.假如是在主界面重连回来,即掉线一方的客户端已经销毁了所有的战斗指令,这时候服务器给他推送[1,2,3,4,5],他需要全部恢复,才能重现战场。