一、背景

移动平台下,网络信号变动非常频繁,造成更高的丢包率,更大的延迟抖动,不稳定的网络连接,处理不好,会造成很不好的游戏体验

二、场景

1.2G/3G/4G/WIFI 相互切换时client的IP变化.
2.地理位置变化导致网络制式的转换,手机基站之间的切换.
3.手机HOME/电源键,电话进来.
4.建筑死角,隧道,信号很弱.
5.信号不稳定,网络延迟抖动,如在火车上(多普勒效应).
6.网络拥塞,在人很多的地方,运营商降低人均通讯带宽,网络延迟增大.
7.手机连接的路由器断网.
8.服务端断电等不可抗力因素.
9.服务端正常关闭.

三、解决方案

从应用层层面来分析

client:
1.场景1,2,8客户端立马就能感知,通过捕获网络异常.
2.场景3,vivo手机不会有反应,应用切换到后台后子线程还在处理心跳包,后台切换为前台时,照样运行,有的手机如苹果,华为不是,需要验证.
3.场景4,5,6 通过心跳包.
4.场景7通过捕获socket异常,websocket在浏览器不会产生异常.
5.场景9,通过客户端收到字节数为0判断.

server:
1.定时检测客户端心跳包,延迟下线时间300s,超过300s则为客户端离线.
2.重连接口,先校验,发现有此账号的fd,则把之前的fd踢掉,老状态赋予给新fd.
3.记录玩家所在游戏场景,重连上来后给出相应的回包,如在登录场景,主场景的区别就是主场景需要下发各大系统模块的数据包。
4.断线时客户端最先知道,服务端配合即可.

处理逻辑

1.上述情况归纳为1.异常,2.心跳超时 3.回包超时.
2.回包超时->转菊花并屏蔽输入->心跳超时.
3.异常,心跳超时->断线重连.

断线重连

0.重连尝试3次,超过则弹框提示,返回登录。重连成功则走下面.
1.完整登录,如果第三方的token实效,需要用本地记录的账号和密码登录,去验证.
2.简洁登录,直接用保存的token去后台登录.
3.后台根据玩家所在场景下发相应的数据包.

参考

1.https://sunyeming.github.io/2017/11/23/net-reconnect/.
2.http://gad.qq.com/article/detail/13856.
3.https://www.jianshu.com/p/d610d352e1f0.
4.https://blog.csdn.net/u010377179/article/details/52930768.
5.ebay的大牛supersocket c#版本的网络库.