如何处理游戏断线重连
以前玩王者荣耀,游戏在后台。当我进入前台时,我发现我可能会以加速的方式在后台播放刚才游戏的视频,直到我到达最近的点(这只是我的猜测)。
1.如果网络状况异常(比如切换网络或者当前网络不稳定),客户端会触发断开连接再连接(此时客户端网络已经断开)。
2.由于网络延迟和网络链接异常,心跳包无法正常发送到服务器。
这里可以有两种判断方法,一种是针对服务器的,一种是针对客户端的。
3.客户端裁剪游戏,客户端在后台。一定时间后,服务器会主动断开与客户端的连接,客户端需要主动触发重新连接。
主要分为四个阶段。
1.连接时记录网络类型,切换到前台,再次获取网络类型。如果类型不一致,您需要重新连接。
2.记录连接的IP地址,切换到前台获取IP。如果IP不同,则需要重新连接。
这里会出现一些问题,就是当我们切换网络的时候,也会出现断网重连的情况,因为wifi情况下的IP和4g情况下的IP是不一样的(这个我还不明白怎么解决,王者荣耀里也有这种情况)。
首先,在通信包的协议设计中,每个包头都包含一个名为pkgid的字段。
客户端的每个上行请求包都有一个下行响应包被服务器一一对应,它们的pkgid是一样的。
服务器的主动推送包pkgid=0。
客户端的实现:
客户端有一个队列,记录发送的请求包,然后在收到服务器的响应后删除相应的请求。
如果超时后没有收到响应,可以认为有断线,重新发送缓存的请求,将pkgid设置为负数来标记重传包。
重试次数是有限制的。如果超过次数仍得不到回复,会提示断开连接,退出登录界面。
服务器的实现:
服务器打开缓存池,记录一定数量的最近响应包和通知推送包。
当收到一个重传包时,通过player id+pkgid从缓存池中索引最近缓存的响应包,如果缓存命中则直接发出记录,否则重传失败,服务器做线程踢(线程踢完后,客户端继续进行登录过程)。
当客户端断开连接时,用户会进入主机状态,直到用户因为主机游戏再次进入。