1、断线重连的必要性

在端游时代,因为游戏环境比较固定,断网的可能比较小,断线重连就没有那么重要,甚至有的游戏都没有断线重连,判断你断线了直接返回到登录界面,走重新登录的流程。

但在移动设备的情况下,环境非常不固定,网络也有可能非常不稳定,如果按照早期的端游的做法,直接走登录流程,那用户的体验感就非常的不好。

当然也有的判断断线了直接将网络connect上就好了,但是并没有那么简单。因为用户的操作是不确定的,用户有可能在停留在任意界面。

比如:在抽卡的时候进入电梯,断网了,这时send (抽卡)message给服务器,等联网的时候

服务器并没有收到抽卡消息,这时大家想想会是什么样的情况,消息就丢失了。因为抽卡功能游戏氪金的一个重要系统,美术和策划小伙伴希望把这个功能做的绚丽点,可能分为几个步骤完成,下一步骤高度依赖于服务器上一条消息返回,中间任何消息的丢失都不行,丢失了都有可能会各种异常,对于客户端程序员来说通过特殊处理这种情况那就会欲仙欲死,痛苦务必。

所以我们要在底层实现一个一劳永逸的机制实现我们的消息正确性,断线重连消息正确性确认就尤为重要。

2、断线重连的思路及伪代码实现

//伪代码,消息的定义
message
{    int length;    //消息长度short msgId;   //消息IDint seq;   //消息序号bytes body;    //消息体
}

}

对于对于客户端和服务器都有两个变量sendSeq(本地发送序列号)和recvSeq(接收到的序列号)

sendSeq:

我发主动发送的序号,每次发送消息都会自增sendSeq++,sendSeq在特殊情况下不会更新。登陆、重连、心跳信号等消息除外,具体还有哪些消息根据业务情况自己定义。

recvSeq:

        记录收到对方当前序列号,如果是message.seq非0的序号都会被记录;

1)客户端消息每次发送的必要消息(消息序号都会都会自增sendeq++,并将sendSeq赋值给message.seq;

2)客户对于必要消息进行存储(设定存储一定长度,如最大存储64条),如果缓存区大于最大缓存消息数量,那么就删除最早缓存的消息,保证缓存区存储的消息数量最多不大于设定最大阈值。

//发送消息处理伪代码函数
function sendMessage(message )
{if(消息在忽略列表中){message.seq = 0;}else{sendSeq++;message.seq = sendSeq;//缓存到发送列表中if(cacheSendList.length>=MAX_CACHE_LENGTH)cacheSendList.remove(0);cacheSendList.add(message);}socket.send(message);
}

3)客户端收到接收到的服务器端消息,检查message.seq!=0更新recvSeq

//收到消息处理伪代码函数
function recv(message)
{if(message.seq!=0)recvSeq = message.seq;//处理消息handle(message);
}

4) 服务器端同理实1、2、3步,服务器的缓存过滤的消息包括:聊天、心跳、走马灯等非必要消息内容,它缓存的长度需要设置可以大于64条,根据实际情况而定

5) 客户端当检查到网络断开需要触发断线重连时,客户端断线重连界面(如:在登录中网络断开,并不需要触发重连,直接重新登录就是,只有进入游戏了才触发断线重连),客端发送LoginReconnectToken消息给服务器(附带token内容等验证内容)

//伪代码
LoginReconnectToken
{string token;string userId;//其它内容....
}

6)服务器验证token并返回BeginReconnect,告知客户端开始重连,并把服务器的recvSeq发给客户端

//伪代码
BeginReconnect
{int32 seq;//其他内容...
}

7) 客户端收到服务器的BeginReconnect  消息,将客户端收到的重连前收到的recvseq通过BeginReconnect2返回服务器,并根据当前消息的seq比对发送缓存的消息,进行消息的补发

BeginReconnect2
{int32 seq;//其它内容...}

补发缓存区内容代码:

//发送重连消息伪代码函数,补发的消息序号sendSeq并不需要增加
sendReconnectMessage(seq)
{foreach(message:cacheSendList){if(message.seq <seq)continute;socket.send(message);}
}

8)服务器收到客户端发过来BeginReconnect2消息,根据BeginReconnect2消息中所带seq对消息也进行补发

9)这样双方就重连完成

注意:

其实在实际运用中会有很多特殊情况:重连中有可能再次断网、登陆时断网、连接多次超时或者序号已经相差很大时等特殊处理、服务器缓存优化等问题这都是逻辑问题,并不是我们断线重连的核心内容这里就不做阐述了

手机游戏断线重连的实现相关推荐

  1. JavaScript实现H5游戏断线自动重连的技术

    断线重连的需求 尤其是手机上,会因为网络的不稳定或者其他原因,导致用户的socket链接断开.这个时候如果直接让玩家退出游戏,重新登录,无疑是非常影响用户体验的事情.所以根据这个需求,就有需要程序来实 ...

  2. 手机客户端弱网络下的断线重连处理

    1.弱网络下的断线重连 玩家在游戏过程中,所处的网络环境是复杂多变的,可能是wifi的网络不稳定,或处在3G甚至2G的环境下等.在这些情况下,网络游戏会由于网络或包量等原因而出现延迟,拉拽,甚至掉线等 ...

  3. 移动平台游戏网络重连方案

    1.背景 移动网络信号波动频繁,给移动游戏开发者带来诸多困扰,处理不好会造成较差的用户体验以及重复扣道具等严重问题.因此弱网络问题在TDR技术评审中作为客户端重点挑战项,并且弱网络专项测试达标后方能上 ...

  4. 手游常断线怎么办?试试断线重连处理

    1.弱网络下的断线重连 玩家在游戏过程中,所处的网络环境是复杂多变的,可能是wifi的网络不稳定,或处在3G甚至2G的环境下等.在这些情况下,网络游戏会由于网络或包量等原因而出现延迟,拉拽,甚至掉线等 ...

  5. tcgames使用有延迟_电脑玩手机游戏TC Games手游助手常见掉线及连接问题解决方法...

    Q: 连接过程中提示APK安装失败,无法出现连接按钮 出现该问题有两种原因: 1. 手机上未打开安装运行安装未知来源: 2. 部分手机安装过程中需要人工干预安装过程,如果没有在手机上点击安装,则无法完 ...

  6. 房卡麻将分析系列之断线重连

    "房卡"麻将研发技巧,尽在"红孩儿的游戏开发之路",欢迎关注公众号! 房卡麻将分析系列之"断线重连" 大家好,我是红孩儿,"房卡& ...

  7. 天天炫斗服务器维修,【天天炫斗】弱网处理及断线重连方案

    [天天炫斗]弱网处理及断线重连方案 --hessionhe 一背景及问题描述 天天炫斗采用的是TCP长连接方式,消息交互使用的是TDR方案,弱网问题以及断线重连的情况在手游运营中都是非常普遍的,也会相 ...

  8. 微软亚洲研究院 可视化_如何为亚洲市场本地化手机游戏

    微软亚洲研究院 可视化 With the Asian market rapidly growing, almost every ambitious IT product sooner or later ...

  9. 小程序 video 控制器外观调整_Razer Kishi 评测:吹破天的手机游戏控制器,真有那么好用吗?...

    Razer最近在疯狂推广他的Razer Kishi手机游戏控制器,真有那么好吗? Razer 在游戏领域应该算是如雷贯耳,Kishi 移动控制器是其针对移动游戏的最新产品.Razer Kishi 是一 ...

最新文章

  1. 最新技术选型解决方案列表
  2. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 ExpandoMetaClass 进行方法注入 )
  3. 解题:POI 2004 String
  4. shell -nginx启动脚本
  5. 聊一聊和Nacos 2.0.0对接那些事
  6. 华为鸿蒙怎么体验,华为鸿蒙 HarmonyOS 2.0 发布,教你如何升级体验
  7. JavaScript原生对象属性和方法详解——Date对象
  8. Shadow Map阴影贴图技术之探 【转】
  9. JDBC常用API和使用
  10. 微信分享网页自定义标题和图片
  11. 质因子分解算法c语言prime,分解质因数的算法
  12. DHCP服务器配置windows2016
  13. 拒绝平庸 保罗格雷厄姆_保罗·格雷厄姆(Paul Graham):微软无法处理Y组合器
  14. ubuntu调试android设备不识别
  15. 从腾讯企业邮箱转到网易企业邮箱的正确姿势
  16. 花2w培训数据分析真的值得吗?
  17. 3D地图+智能导航,用微信小程序轻松实现校园内导航
  18. html网页接单广告词,网站广告词
  19. 创新声卡系统更新连接服务器问题,服务器加装声卡的故障
  20. 大带宽服务器是什么?大带宽服务器网络卡顿是什么原因?

热门文章

  1. 大学生如何建立校园外卖平台?这五个重点必须要知道!
  2. c语言 出局者 算法,下一个出局者是谁
  3. DBeaver,一款好用的通用数据库管理器
  4. 赵云和吕布到底谁更厉害?
  5. sqlalchemy钩子
  6. 2021毓英中学高考成绩查询入口,福建省晋江市毓英中学2021届高三上学期12月份考试物理试卷 PDF版含答案.pdf...
  7. css3 实现盒子四周光晕_使用CSS3实现的光晕特效
  8. linux 实验楼Linux 基础入门 作业
  9. 【实验楼挑战】Python3简明教程:字符串挑战
  10. 最全整理!37 个 Python Web 开发框架总结