-
Notifications
You must be signed in to change notification settings - Fork 7
Reconnect
断线重连分两种情况,运行中和意外退出。运行中可能出现弱网络或后台运行,弱网络是网络特别卡,卡网络断开连接了,后台运行网络没有断线,但没有进行收发消息;第二种是意外退出,客户端直接关闭掉或闪退。
目前服务器实现,在代理服务器上,如果出现网络意外断开连接,玩家会在游戏服务器上维持30秒的保活时间,超过30秒,玩家会真正离线,这时候玩家所在的房间和和游戏对局会销毁掉。如果玩家在客户端中通过按钮退出游戏,请求相应的RPC调用代理服务器,以实现立即离线。
已进入游戏大厅或正在游戏中网络断开连接了,需要客户端自行判断网络是否断开,这里分两种情况讨论。
- 通过连接秘钥请求连接代理服务器
- 请求进入大厅
- 通过连接秘钥请求连接代理服务器
- 请求加入游戏
该情况下网络没有断开连接,该过程不需要重新连接代理服务器,服务器采用非阻塞发送数据包,为了发送效率,在多次未成功发送的数据包,会舍弃掉该包,客户端在网络差的情况下有一定概率收不到数据包,需要重新调用进入大厅或加入游戏实现同步。
客户端直接关闭了,客户端先判断登录秘钥是否过期,过期重新登录,没过期再判断代理连接秘钥是否过期,过期重新选择选择区服进入区服,没过期直接连接代理服务器,请求进入大厅。如果存在游戏对局,那么响应包中会有游戏对局的信息,再次加入游戏即可。
ref: https://zhuanlan.zhihu.com/p/326755565
在做断线重连测试的时候,发现客户端如果采用关闭网卡这种方式来断开连接,服务端并没有立即断开连接,而是向正常连接一样保持连接,差不多过了几十秒才断开连接,这种会导致在等待的这几十秒,为了让服务器更快速感应客户端状态,应采用心跳包来解决此问题。
理想状态下,一个TCP连接可以被长期保持,但是实际情况下,一个看似正常的TCP连接,可能已经断连。两个主机之间通讯,往往需要通过多个中间节点,如:路由器、防火墙等。因此两个主机TCP连接保持同样受中间环节影响。断连的TCP连接已经没有意义了,但是维护这样的连接,可能会浪费服务器的系统资源(尤其是内存和socket资源,客户端一般还好),因此需要服务器采取相应的探测措施。
方案:
TCP探测的原理很简单:定期向连接的远程节点发送一定格式的信息,并等待远程节点的反馈。如果规定时间内返回,那么连接正常,否则已经断连。
常见的三种探测方式是:应用程序自己探测;第三方应用程序探测;TCP协议层的保活探测;
应用程序自己探测:可以根据应用程序的特点选择相应的探测机制和功能实现,比较灵活,但是在实际中,大部分程序并未附带;
第三方应用程序探测:在服务器上安装相应的第三方程序,对所有的TCP连接探测,确保连接是否正常。最大的不足是:所有探测的客户端都需要能够识别来自探测应用的数据报文,因此实际应用中比较少见;
TCP协议层的保活探测:最常用的方案。采用了TCP协议层的保活探测功能,即TCP连接保活定时器,尽管该功能不是RFC规范的一部分,但是几乎所有的Unix系统都支持。
为了避免以上情况的发生,客户端与代理服务器采用心跳包来保持连接,如果超过一定时间,客户端未向服务端发送心跳包,说明客户端已断开连接。
ref: https://blog.csdn.net/weixin_30420027/article/details/116823019