前置机制实现:
- 前端维护递增的RequestId,并缓存后端返回的最新ResponseId。
- 后端给前端返回数据包时维护递增的ResponseId,并将ResponseId和对应的返回数据缓存到队列中,以RequsetId进行索引。
主要解决以下弱网问题:
-
回包同步:发包一定时间后若无回包则禁止点击屏幕,防止多次操作;当发包仍然未回包超过某个时间后,则出现等待回包的黑底界面;当发包仍然未回包超过某个时间后,则出现提示玩家进行重试的提示界面。
-
超时重试:点击重试后将重新发送之前超时的包。为了避免多次重复发包导致后端重复处理(可能引起多次资源扣除或者异常报错),前端进行重试时使用之前的RequestId,后端收到已存在的RequestId则从缓存中取出之前的回复内容而不重复进行逻辑处理,若缓存中取不到则当成正常请求处理。
-
网络重连:玩家进行连续2次重试后则第3次重试将会重建Socket并进行游戏重连操作,连续2次重建失败则会踢出游戏。而从网络异常到游戏重连成功期间可能导致丢包,当前端进行重连时附带前端收到最新的ResponseId,后端根据收到的ResponseId判断前端丢掉了多少包,并在重连回包中从缓存中取出进行补发,若缓存中取不到则报错踢出游戏告知掉线。
-
后台返回:游戏切到后台后游戏可能会被暂停,在游戏暂停时网络模块将正常接收数据并缓存,但是不进行逻辑层的分发,会在游戏恢复时一起分发。在游戏切回前台后要发个心跳包进行网络状态检测,会有3种情况:1.心跳包正常返回,代表网络正常,不进行任何处理。2.检测心跳包返回报错,这时一般是玩家切后台太久被后端认定为掉线(此时后端不再缓存玩家数据包),需要踢出游戏。3.socket抛出异常断开连接/检测心跳包超时,认定为网络断开(一般安卓开了省电策略会禁用后台网络导致断开),此时进行重连,走重连逻辑。