断线重连

以下纯属理论,无实践
1,后端定时向前端发心跳包(每次序列号加1),后端收到后回复一个,如果前端或后端在3秒内未收到心跳,则认为网络状况差,停止发送/接收游戏数据,继续发心跳包进行网络测速,直到网速达标(适用于对战类游戏,如王者荣耀),或者提示网络状态不佳,断开连接(MMORPG),
这种情况下的断线,不进行重连,但这是断线重连的基础。
这种情况下,再次重连时不会有数据丢失,可以继续上次数据发送
2,突然性网络断开,异常被捕获后,前后端都立即知道了网络断开
断开之前可能有一些数据已经从后端发出,还未到达前端,前端断开连接后,数据到达不了前端,丢失了,
前后端开始断线重连处理:前端每隔1秒向后端发送一次连接请求,直到连接上,若尝试10次仍不能连接上,提示服务器无法连接,请检查网络状况。
连接上的,服务器知道这是断线的重连,因为断开时服务器已经记录下了玩家ID,
此时,服务器向前端下发一个断线重连的回复数据,数据中有序列号,前端拿这个序列号与前端序列号对比,若后端大于前端,则知道断线之后发生了丢包,然后把当前序列号发给后端,
后端将自己的序列号与前端发来的序列号对比,如相等,则一切正常。若不等(一定是小于,不可能大于)
则去缓存中去取缓存的协议数据,从前端的序列号开始处重新发送给前端。
这样当玩家重连成功后,服务就会将玩家断线期间周围玩家的走路广播,以及断线前玩家的请求的回复数据(比如买了某个物品,刚点击了物品)重新下发,像魔兽世界就是这样的,断线后重新成功,会看到一个急速的动画播放,这就是后端在急速补包,前端做了加速表现。

posted @ 2018-08-17 14:20  时空观察者9号  阅读(462)  评论(0编辑  收藏  举报