游戏断线重连方案

游戏断线重连在手游中时一个非常普遍的现象, 这里提供一种当前正在使用的处理方案

  1. 客户端上行包添加包序

    客户端在本地维护一份上行包包序, 每次向服务端发送消息时, 对包序做自增处理, 所有上行包中, 都应该添加包序字段

    1
    2
    3
    4
    message C2SRequest {
    required uint32 seq = 1; // 上行包序
    // ...
    }
  2. 服务端记录上行包序

    服务端记录一份最后收到的消息包的包序, 收到新消息包之后, 如果包序小于记录值, 就做丢包处理, 防止重复处理客户端请求

  3. 服务端下行包添加包序

    服务端对下发给客户端的每个消息包添加一个下行包序, 在发送下行消息后, 对包序做自增处理

    1
    2
    3
    4
    message S2CResponse {
    required uint32 seq = 1; // 下行包序
    // ...
    }
  4. 下行包缓存

    服务端发送消息给客户端时, 将消息包序列化完毕之后, 需要缓存一部分数量的消息包

  5. 发起重连

    客户端出现网络不稳定等问题时, 发送断线重连请求, 消息包中应带上最近一次收到的消息包包序

    1
    2
    3
    4
    message C2SReconnect {
    required uint32 seq = 1; // 下行包序
    // ...
    }
  6. 缓存消息同步

    服务端在收到断线重连的请求后, 检查重连请求中的包序与当前记录的下行包序, 如果他们的差值超过当前缓存的消息包的长度, 说明客户端丢包数量太大, 需要进行重登录处理, 反之就将缓存消息包中, 客户端丢失的那部分重新下发.