基于Json的数据同步
Contents
前言
游戏服务器与客户端的数据同步,各家有各家的秘籍。下面我就分享一下http服务器和客户端基于JSON文件的数据同步的思路。
何时同步
http短连接,就是每次返回客户端消息时,包同步数据带回去。同步数据放到消息返回前。
Json文件制作和格式剖析
card.json
{
TagName: card //此为json标识,前后端解析识别
keys: [ //keys为Json具体数据键值
{
keyName: 'GUID',
comment: '唯一ID', //同步数据时用户标识此OBj,全局唯一
type: 'String',
value: ''
},
{
keyName: 'uid',
comment: '玩家UID', //基本说明,利于维护
type: 'Number', //数据类型,可做基本校验
value: 10000, //初始数据默认值,
},
{
keyName: 'level',
comment: '等级',
type: 'Number',
value: 0
},
{
keyName: 'ctSkin',
comment: '皮肤',
type: 'Array',
value: []
}
]
}
Json文件设计对应Obj格式
简单描述下,JSON文件对应的Obj对象怎么设计
{
tagName: card, //obj对应JSON文件名字
keyIndex: { //同步时需要记录变更的数据位置,比直接传keyName要好
GUID:0,
uid:1,
level: 2,
ctSkin: 3,
},
keyValue: ['10001@10000', 10000, 5, []] //本地保存,此OBj所有数据
changeKeys: [2] //变更了那些Key
function syncChangeToClient () {
//简单的算法对应完毕
[变更的JSON原型对应怎么解析,[[变更的位置,变更后数据格式],[变更的位置,变更后数据格式]],全局索引GUID(用来和多个卡牌做区分)]
//卡牌'10001@10000'索引的对象,数据1位置变更为10
return ['card', [[1, 10]], '10001@10000'],
}
function syncToClient () {
//简单的算法对应完毕
[JSON原型名字,[当前所有数据]]
return ['card', ['10001@10000', 10000, 5, []]],
}
}
同步的类型
同步需要只要需要3个数据表示出,增加[1]、删除[2]、更新[3]
增加
这种增加,一般都是把新生成Obj全部同步给客户端。 eg:
{
1:[ //数组,为了支持一次同步所有增加、删除、更新
obj.syncToClient();//每一个增加的对象
obj.syncToClient();//每一个增加的对象
...
]
}
删除
删除Obj一般只需要提供tagName外加GUID即可 eg:
{
2:[ //数组,为了支持一次同步所有增加、删除、更新
[
card,'10001@10000'
],
...
]
}
更新
更新需要提供tagName,GUID,以及每个更新的Key索引和最后的值 eg:
{
3:[ //数组,为了支持一次同步所有增加、删除、更新
obj.syncChangeToClient();//每一个更新的对象
obj.syncChangeToClient();//每一个更新的对象
]
}
同步的基础规则
1.更新后删除的,数据不同步更新的字段,只同步删除 2.单个Obj多次更新的,每个Key只同步最后值,一次同步完毕 3.增加后更新的,只同步增加全部属性 4.增加后删除的,不同步数据 5.删除又增加的,理论不出现,但要同步增加的数据 6.增加、同步、删除各个key内有数据才有,比如只有增加同步只需key1就行,都有的话,就是{1:[],2:[],3:[]} 7.每次同步完毕都要清除本书数据变更状态
结束语
思路还是比较乱,设计还是不是很成熟。终究是没有实际代码去验证,自己也很遗憾,等后续有成品东西出来,再接着验证去分享。
Author wangkm
LastMod 2018/06/14