文档章节

Android客户端与服务器端数据同步

当空皓月
 当空皓月
发布于 2017/07/11 11:52
字数 1221
阅读 7
收藏 1
点赞 0
评论 0

应用场景

假设我们在做一个通讯录软件,我们可以在多个客户端对服务端的数据进行增删改。那么这篇文章中我们要解决的问题是如何在客户端与服务端只传输经过增删改操作的数据,来使得客户端与服务端的数据是同步的。

名词解释

Anchor:同步锚点,用时间戳来表示,用来发现两端数据变化的部分

客户端表设计

每条记录包含两个用来同步用的字段: 
status : 用来标识记录的状态 
anchor : 记录服务端同步过来的时间戳

anchor 含义
0 本地新增
-1 标记删除
1 本地更新
9 已同步

服务端表设计

modified : 服务端修改记录的时间戳

双向同步过程

初始状态下,我们假设客户端和服务端的表各有两条数据 
客户端:

id name phone status anchor
1 Ken 18612345678 9 2
2 Jim 13888888888 9 3

服务端:

id name phone modified
1 Ken 18612345678 2
2 Jim 13888888888 3

此时,客户端与服务端的数据是完全同步好了的

Client增加1条记录

id name phone status anchor
1 Ken 18612345678 9 2
2 Jim 13888888888 9 3
3 Tim 12345678 0 0

Client修改1条记录

id name phone status anchor
1 Ken 18612345678 9 2
2 Jim 010-12345678 1 3
3 Tim 12345678 0 0

:因为上面的数据不是从服务端同步过来的,所以anchor默认为0

Client发送本地更新

SELECT * FROM table WHERE status < 9
  • 1

客户端执行上面的SQL语句,找出客户端需要同步到服务端的记录。通过网络串行的发送给服务端。上一条请求没有得到回应的话,就不能进行下一个请求。 
下表中的数据是发送的同步消息

id name phone status anchor
2 Jim 010-12345678 1 3
3 Tim 12345678 0 0

Server处理同步消息

服务端串行的收到客户端发送过来的数据,首先处理第一条数据

id name phone status anchor
2 Jim 010-12345678 1 3

服务端收到请求后需要对比客户端的anchor和服务端的modified,只有服务端modified=客户端anchor才能继续同步,否则说明客户端在上一次同步后服务端更新过数据,需要解决冲突后才能继续,接着根据status的值为1,那么服务端执行UPDATE语句

UPDATE table SET (name, phone) VALUES (?, ?) WHERE id = ?
  • 1

其次,处理第二条数据

id name phone status anchor
3 Tim 12345678 0 0

如果得知anchor = 0,直接执行INSERT 语句

INSERT INTO table (id, name, phone) VALUES(?, ?, ?)
  • 1

服务端经过这两次操作后,数据表如下

id name phone modified
1 Ken 18612345678 2
2 Jim 010-12345678 6
3 Tim 12345678 8

Client根据响应更新本地记录

服务端处理完数据后,还要响应客户端的请求,如下

id status anchor
2 9 6
3 9 8

收到响应后,客户端就开始执行UPDATE了

UPDATE table SET status = ?, anchor = ? WHERE id = ?
  • 1

客户端现在的数据表如下:

id name phone status anchor
1 Ken 18612345678 9 2
2 Jim 010-12345678 9 3->6
3 Tim 12345678 9 0->8

Server增加一条数据并更新一条数据

id name phone modified
1 Ken 00000000 11
2 Jim 010-12345678 6
3 Tim 12345678 8
4 Bill 88888888 10

Client向Server请求数据

因为服务端modified字段代表的是时间戳,所以Max(anchor)表示客户端最近一次同步的时间,如果存在服务端modified > Max(anchor),说明服务端需要向客户端同步数据。 
服务器端执行下面的SQL语句:

SELECT * FROM table WHERE modified > Max(anchor)
  • 1

返回下表中的数据:

id name phone modified
1 Ken 00000000 11
4 Bill 88888888 10

Client处理同步消息

客户端根据增量数据更新本地表,处理数据时,只能更新状态为已同步或者不存在的数据

id name phone status anchor
1 Ken 00000000 9 2->11
2 Jim 010-12345678 9 6
3 Tim 12345678 9 8
4 Bill 88888888 9 10

客户端删除记录

逻辑删除记录

id name phone status anchor
1 Ken 00000000 -1 15
2 Jim 010-12345678 9 6
3 Tim 12345678 9 8
4 Bill 88888888 9 10

客户端发送消息到服务端

根据status < 9,将逻辑删除的记录发送至服务端,服务端收到消息后,将该记录移至deleted_table(相当于时光机,以后可以进行数据的恢复)表中

id name phone modified
1 Ken 00000000 16

服务端响应客户端的请求

id status anchor
1 -1 16

客户端收到响应

客户端直接进行物理删除

服务端删除记录

如果客户端从服务端获取的增量信息中包含删除记录的消息,则客户端直接进行物理删除。

原文链接: http://blog.csdn.net/coder_ken/article/details/50920606

© 著作权归作者所有

共有 人打赏支持
当空皓月
粉丝 13
博文 179
码字总数 67070
作品 0
郑州
android网络通信之socket教程实例汇总

一、socket基础 1、Socket通讯机制(详细),如何将socket通信的客户端与服务器 http://www.eoeandroid.com/thread-61727-1-1.html 2、Http和Socket区别 http://www.eoeandroid.com/thread-9...

程序袁_绪龙
2014/12/11
0
0
Android客户端与服务器交互方式-小结

最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json。要在Android手机客户端与pc服务器交互,需要满足下面几种条件...

x-knight_勋爵
2016/04/18
0
0
Android消息推送完美方案

推送功能在手机应用开发中越来越重要,已经成为手机开发的必须。在Android应用开发中,由于众所周知的原因,Android消息推送我们不得不大费周折。本文就是用来和大家共同探讨一种Android消息...

Yujan
2014/04/10
0
0
Android AIDL浅析及异步调用

AIDL:Android Interface Definition Language,即 Android 接口定义语言。 AIDL 是什么 Android 系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。 为了使其...

cspecialy
05/20
0
0
安全狗服云Android版V1.4 手机也能远程桌面

服云Android客户端推出的新版本V1.4全面覆盖了服云WEB端与PC端的主要功能,并根据安卓系统的特点对操作方式和界面风格都进行了适当的调整。 服云Android客户端V1.4 新增的远程桌面功能,该功...

小猪猪的风
2014/05/05
0
0
android自启动服务,研究自用

1、开机自启动 2、系统服务(需要用到AIDL进行数据传输);拿到需求的第一步准备下手的是开机自启动。 一、开机自启动 这里要分三步走: 第一步:加入开机自启动权限 <uses-permission andro...

捍卫机密
07/10
0
0
基于Android移动平台僵尸网络模拟工具设计与实现

移动端:基于Android系统开发的应用,表层应用是基于baiduMap 路线规划app 服务端:基于python web 开发框架 django 实现。 通信信道:基于第三方SDK Jpush推送消息+自己一套加密系统 推送原...

颓废的幻想者
2015/06/29
0
0
Android推送通知指南

在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户 端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相对...

LiSteven
2013/03/28
0
0
Android 服务器推送技术

在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相对比...

晨曦之光
2012/03/15
0
6
基于Android平台简易即时通讯的研究与设计

1 Android平台简介 Android是Google公司于2007年11月5日推出的手机操作系统,经过2年多的发展,Android平台在智能移动领域占有不小的份额,由Google为首的40多家移动通信领域的领军企业组成开...

今幕明
2014/12/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

shell及python脚本方式登录服务器

一、问题 在工作过程中,经常会遇见需要登录服务器,并且因为安全的原因,需要使用交互的方式登录,而且shell、python在工作中也经常用到,并且可以提供交互的功能。都是利用了expect、spawn...

yangjianzhou
4分钟前
0
0
upstream sent too big header while reading...

nginx 报错:1736 upstream sent too big header while reading response header from upstream 1. 一般处理 location ~ \.php$ { #增加下面两句 fastcgi_buffer_size 128k; ......

dubox
15分钟前
0
0
Python解析配置文件模块:ConfigPhaser

import configparser as pa# [SectionA]# a = aa# b = bb# c = cc# [SectionB]# optionint = 1# optionfloat = 1.1# optionstring = string#https://www.cnblogs.com/a......

易野
21分钟前
0
0
Java基础——面向对象

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Object的方法: clone() Object 克隆 to Strin...

凯哥学堂
23分钟前
0
0
rabbitmq学习记录(八)消息发布确认机制

RabbitMQ服务器崩了导致的消息数据丢失,已经持久化的消息数据我们可以通过消息持久化来预防。但是,如果消息从生产者发送到vhosts过程中出现了问题,持久化消息数据的方案就无效了。 Rabbit...

人觉非常君
27分钟前
0
0
毕业5年,我是怎么成为年薪30W的运维工程师

#转载# 我在大学读的是计算机专业,但大学毕业之后,进入到一家私企进行工作,工作的内容类似于网管,会经常的去修电脑,去做水晶头等内容。刚开始工作,也没想太多,最想的是丰富自己的工作...

Py爱好
35分钟前
1
0
大数据基础知识,大数据学习,涉及的知识点

一、什么是大数据 一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库软件工具能力范围的数据集合,具有海量的数据规模、快速的数据流 转、多样的数据类型和价值密度低四大特征。...

董黎明
50分钟前
0
0
Linux CentOS 7上安装极点五笔

话说几天前在新买的惠普笔记本上成功地安装了Linux CentOS 7操作系统、Nvidia Quandro P600驱动程序及X Window,并在VMware下安装Red Hat教学环境,彻底跳出Windows的苦海,但仍然有一件事不...

大别阿郎
今天
17
0
2018年7月20日集群课程

一、集群介绍 集群,简单地说是指一组(若干个)相互独立的计算机,利用高速通信网络组成一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。 ...

人在艹木中
今天
0
0
spark开发机中调试snappy

目的 在Idea中的点击运行,使spark可以直接读取snappy 自己编译hadoop,以支持snappy的压缩。 自己编译的目的就是要得到支持snappy文件读写的动态链接库。如果可以在网上下载,可以跳过自行编...

benny周
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部