多终端数据同步机制设计(二)
多终端数据同步机制设计(二)
如果您没有看上一篇文章,建议您先移步到这里查看第一部分 上一次主要解决了基本的数据增量同步的问题,但仍然存在一些问题。 可能存在的主要问题:
针对以上可能出现的这两个问题,需要对数据进行校验并且数据量超过一定量时进行分批量传输, 本文将着手解决 数据校验 和 数据分批次传输 这两个问题。
结合之前的同步流程,加上数据校验和分批次传输数据,大概流程如下: 客户端调用服务器端的 更新到最新版本之后,判断本地是否存在未提交的版本,如果本地不存在修改则本次数据同步完成,如果本地存在修改,则提交本地修改,提交本地数据的之前要先计算传输数据的校验值,校验值和本地数据一起传给服务器端 下面展示添加数据校验后的主要流程图:
?
?
?
?
数据校验,我们用的是MD5进行校验,取传输数据的MD5,使用MD5有两方面的考虑: 一方面因为MD5生成的字符串不算太长,不会影响传输的数据量, 另一方面也是因为MD5比较通用一些,APP端实现起来也比较方便。
数据分批次传输,自己感觉这里实现的比较 LOW ,这里类似于网站上的分页,没想到更好的解决方案,期待大神分享更好的解决方案。 返回客户端 当前请求数据页码索引 和 本次数据传输总页数,如果页码索引小于总页数,则页码索引+1,再请求一次接口知道返回的页码索引等于总页数。
数据转MD5踩到的坑数据转MD5的时候,再次踩了一个坑, 开始是这样做的,用MD5算法计算出字节数组,然后使用 下面祭出我鲜血淌过的代码【笑Cry】 1 /// <summary> 2 /// 对象转换为MD5字符串 3 </summary> 4 <param name="obj">对象</param> 5 <param name="isLowwer">是否是小写 6 <returns></returns> 7 public static string ToMD5String(this object obj,bool isLowwer = false) 8 { 9 if (obj == null10 { 11 return ""; 12 } 13 //创建MD5对象 14 MD5 md5 = new MD5CryptoServiceProvider(); 15 byte[] byteArray = 16 using (MemoryStream ms = MemoryStream()) 17 18 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter().Serialize(ms,obj); 19 byteArray = ms.ToArray(); 20 21 计算指定字节数组的哈希值 22 byte[] bMD5 = md5.ComputeHash(byteArray); 23 释放加密服务提供类的所有资源 24 md5.Clear(); 25 System.Text.StringBuilder sbMD5Pwd = System.Text.StringBuilder(); 26 if (isLowwer) 27 28 for (int i = 0; i < bMD5.Length; i++29 { 30 将每个字节数据转换为2位小写的16进制的字符 31 sbMD5Pwd.Append(bMD5[i].ToString("x2")); 32 } 33 34 else 35 36 37 38 将每个字节数据转换为2位大写的16进制的字符 39 sbMD5Pwd.Append(bMD5[i].ToString(X240 41 42 return sbMD5Pwd.ToString(); 43 } ? End最后提供整个同步流程设计的流程图,点我下载 另如果你有别的方案欢迎共同讨论,希望大神看到能给出自己的看法和意见,有不正确的地方还希望能够告知。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |