游戏断线重连在手游中时一个非常普遍的现象, 这里提供一种当前正在使用的处理方案
客户端上行包添加包序
客户端在本地维护一份上行包包序, 每次向服务端发送消息时, 对包序做自增处理, 所有上行包中, 都应该添加包序字段
1
2
3
4message C2SRequest {
required uint32 seq = 1; // 上行包序
// ...
}服务端记录上行包序
服务端记录一份最后收到的消息包的包序, 收到新消息包之后, 如果包序小于记录值, 就做丢包处理, 防止重复处理客户端请求
服务端下行包添加包序
服务端对下发给客户端的每个消息包添加一个下行包序, 在发送下行消息后, 对包序做自增处理
1
2
3
4message S2CResponse {
required uint32 seq = 1; // 下行包序
// ...
}下行包缓存
服务端发送消息给客户端时, 将消息包序列化完毕之后, 需要缓存一部分数量的消息包
发起重连
客户端出现网络不稳定等问题时, 发送断线重连请求, 消息包中应带上最近一次收到的消息包包序
1
2
3
4message C2SReconnect {
required uint32 seq = 1; // 下行包序
// ...
}缓存消息同步
服务端在收到断线重连的请求后, 检查重连请求中的包序与当前记录的下行包序, 如果他们的差值超过当前缓存的消息包的长度, 说明客户端丢包数量太大, 需要进行重登录处理, 反之就将缓存消息包中, 客户端丢失的那部分重新下发.