目录

一、什么是推送?

二、解决数据同步的问题

三、移动无线网络的特点

四、Android 平台上长连接的实现

五、服务器设计

六、消息推送的一般有的方式

七、参考资料


一、什么是推送?

消息推送最简单的方法就是使用第三方的,比如现在使用比较多的是极光推送,极光推送的技术原理是:移动无线网络长连接

二、解决数据同步的问题

为了解决数据同步的问题,在手机平台上,常用的方法有2种

  1. 定时去服务器上查询数据,也叫Polling
  2. 手机跟服务器之间维护一个TCP 长连接

三、移动无线网络的特点

因为IP v4 的IP 量有限,运营商分配给手机终端的IP 是运营商内网的IP,手机要连接Internet,就需要通过运营商的网关做一个网络地址转换(Network Address Translation,NAT)。简单的说运营商的网关需要维护一个外网IP、端口到内网IP、端口的对应关系,以确保内网的手机可以跟Internet 的服务器通讯。对于大部分移动无线网络运营商都在链路一段时间没有数据通讯时,会淘汰NAT 表中的对应项,造成链路中断。
 

四、Android 平台上长连接的实现

为了不让NAT 表失效,我们需要定时的发心跳,以刷新NAT 表项,避免被淘汰。Android 上定时运行任务常用的方法有2种,一种方法用Timer,另一种是AlarmManager。

  1. Timer            

    Android 的Timer 类可以用来计划需要循环执行的任务,Timer 的问题是它需要用WakeLock 让CPU 保持唤醒状态,这样会大量消耗手机电量,大大减短手机待机时间。这种方式不能满足我们的需求。

  2. AlarmManage

    AlarmManager 是Android 系统封装的用于管理RTC 的模块,RTC (Real Time Clock) 是一个独立的硬件时钟,可以在CPU 休眠时正常运行,在预设的时间到达时,通过中断唤醒CPU。这意味着,如果我们用AlarmManager 来定时执行任务,CPU 可以正常的休眠,只有在需要运行任务时醒来一段很短的时间。极光推送的Android SDK 就是基于这种技术实现的。

五、服务器设计

 当有大量的手机终端需要与服务器维持长连接时,对服务器的设计会是一个很大的挑战。假设一台服务器维护10万个长连接,当有1000万用户量时,需要有多达100台的服务器来维护这些用户的长连接,这里还不算用于做备份的服务器,这将会是一个巨大的成本问题。那就需要我们尽可能提高单台服务器接入用户的量,也就是业界已经讨论很久了的C10K 问题。

 

六、消息推送的一般有的方式


上面只是针对极光推送来说,下面是具体的消息推送的一般有的方式:


1) 通过SMS进行服务器端和客户端的交流通信
       在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,且依赖于运营商


2) 循环主动定时获取
       这种方法需要客户端来做一个定时或者周期性的访问服务器端接口,以获得最新的消息。轮询的频率太慢可能导致某些消息的延迟,太快则会大量消耗网络带宽和电池


3) 持久连接
       这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。我们需要开一个服务来保持和服务器端的持久连接(苹果就和谷歌的C2DM是这种机制)。但是对于Android系统,当系统可用资源较低,系统会强制关闭我们的服务或者是应用,这种情况下连接会强制中断。(Apple的推送服务之所以工作的很好,是因为每一台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的。即所有的推送服务都是经由一个代理服务器完成的,这种情况下只需要和一台服务器保持持久连接即可。C2DM=Cloud to Device Messaging)。

4) 总结
       相比之下第三种还是最可行的。为软件编写系统服务或开机启动功能;或者如果系统资源较低,服务被关闭后可以在onDestroy ()方法里面再重启该服务,进而实现持久连接的方式。
C2DM内置于Android的2.2系统上,无法兼容老的1.6到2.1系统;且依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用。
建立在TCP协议之上的XMPP协议,不仅可提供可这种持久连接的功能,能实现服务器和客户机的双工通信,还能不依赖与系统版本和google服务器的限制,提供了比较好的解决方案。

七、参考资料

          著名的C10K并发连接问题

          为什么QQ用的是UDP协议而不是TCP协议?

 

更多相关文章

  1. 万字长文带你了解最常用的开源 Squid 代理服务器
  2. Nginx系列教程(一)| 手把手教你在Linux环境下搭建Nginx服务
  3. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  4. android 模拟器和电脑服务器端用socket通讯
  5. Android(安卓)是Google开发的基于Linux平台的开源手机操作系统
  6. 手机的软件形态
  7. Android之Socket通信
  8. Android推送通知的实现--采用MQTT协议实现Android消息推送
  9. Android文件上传下载

随机推荐

  1. Ubuntu android sdk manager 无法更新
  2. android 调用系统图片浏览器并返回图片路
  3. android 自定义view 不执行 ondraw的解决
  4. Android(安卓)view手势缩放与移动
  5. Android(安卓)BroadcastReceiver两种注册
  6. android一个简单的线程实例
  7. Android捕获Home键
  8. Android中的category大全
  9. Android使用selector改变文字的颜色
  10. android第三天--AbsoluteLayout绝对布局