消息推送

http://blog.csdn.net/axi295309066/article/details/53180628

消息推送

标签: 消息推送push极光推送小米推送即时通信

2016-11-16 00:16 70人阅读 评论(0) 收藏 举报

分类:

Android基础(79)

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]

消息推送,即时通信,目的:想办法让服务器能够及时的通知客户端

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

实现方案

1、轮询

客户端每隔一定的时候就向服务器发出请求,获得最新的信息。特点:

  • 如果用在最新新闻通知上,那么效率就比较低了。
  • 技术简单,好现实。

应用场景:当服务器端的数据以固定的频率更新,比如 股票行情。

2、发短信

特点:效率高,最及时,同时,费用也是最高的。
应用场景:比较土毫的做法,不差钱。

3、使用第三方的开源项目

AndroidPN ( Android push notify)

4、使用第三方的API实现推送功能

小米推送,百度推送、极光推送、个推、微信推送

实现方式3和4原理上都属于消息推送。

消息推送 的实现原理:Socket长联接 + 心跳桢

XMPP 网络上开源的,用于网络聊天的网络协议

asmack.jar jar包是对xmpp协议的实现

推送原理

  • xmpp 是一种基于TCP/IP的协议, 这种协议更适合消息发送
  • socket 套接字, 发送和接收网络请求
  • 长连接 keep-alive, 服务器基于长连接找到设备,发送消息
  • 心跳包 , 客户端会定时(30秒一次)向服务器发送一段极短的数据,作为心跳包, 服务器定时收到心跳,证明客户端或者,才会发消息.否则将消息保存起来,等客户端活了之后(重新连接),重新发送.

客户端轮询(客户端定时主动拉取数据), 浪费流量, 浪费性能
谷歌推送服务(不能用,被墙了)

移动互联网络的现状

因为手机平台本身、电量、网络流量的限制,移动互联网应用在设计上跟传统PC 上的应用很大不一样,需要根据手机本身的特点,尽量的节省电量和流量,同时又要尽可能的保证数据能及时到达客户端。为了解决数据同步的问题,在手机平台上,常用的方法有2种。

一种是定时去服务器上查询数据,也叫Polling,还有一种手机跟服务器之间维护一个TCP
长连接,当服务器有数据时,实时推送到客户端,也就是我们说的Push。从耗费的电量、流量和数据送达的及时性来说,Push
都会有明显的优势,但Push 的实现和维护成本相对较高。在移动无线网络下维护长连接,相对也有一些技术上的难度

移动无线网络的特点

因为IP v4 的IP 量有限,运营商分配给手机终端的IP
是运营商内网的IP,手机要连接Internet,就需要通过运营商的网关做一个网络地址转换(Network Address
Translation,NAT)。简单的说运营商的网关需要维护一个外网IP、端口到内网IP、端口的对应关系,以确保内网的手机可以跟
Internet 的服务器通讯。

对于大部分移动无线网络运营商都在链路一段时间没有数据通讯时,会淘汰NAT 表中的对应项,造成链路中断。

Android 平台上长连接的实现

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

Timer

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

AlarmManager

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

服务器设计

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

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

通过SMS进行服务器端和客户端的交流通信

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

循环主动定时获取

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

持久连接

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

相比之下第三种还是最可行的。为软件编写系统服务或开机启动功能;或者如果系统资源较低,服务被关闭后可以在onDestroy ()方法里面再重启该服务,进而实现持久连接的方式。

C2DM内置于Android的2.2系统上,无法兼容老的1.6到2.1系统;且依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用。

建立在TCP协议之上的XMPP协议,不仅可提供可这种持久连接的功能,能实现服务器和客户机的双工通信,还能不依赖与系统版本和google服务器的限制,提供了比较好的解决方案。

小米消息推送服务

目前用的最多的,也是最稳定消息推送服务,http://dev.xiaomi.com/console/appservice/push.html

极光推送

时间: 2024-12-05 03:43:05

消息推送的相关文章

物联网核心协议—消息推送技术演进

消息触达能力是物联网(internet ofthings, IOT)的重要支撑,而物联网很多技术都源于移动互联网.本文阐述移动互联网消息推送技术在物联网中的应用和演进. 一.物联网架构和关键技术 从开发的角度,无线接入是物联网设备端的核心技术,身份设备管理和消息推送技术是物联网云端的核心技术.而从场景体验的角度,除了前者,还要包括手机的前端开发技术. 在上一篇<一张图读懂基于微信硬件平台的物联网架构>博文中,笔者曾用一张大图详细描述了基于微信硬件平台的物联网架构的组成要素.关键场景.和通信协议

atitit.极光消息推送服务器端开发实现推送&#160;&#160;jpush&#160;v3.&#160;总结o7p

atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p 1. 推送所设计到底功能1 1.1. 内容压缩1 1.2. 多引擎1 2. reg  ,设置appkey and pwdkey1 3. 下载server  sdk   v31 4. push推送样例1 5. Code3 1. 推送所设计到底功能 1.1. 内容压缩 1.2. 多引擎 2. reg  ,设置appkey and pwdkey 3. 下载server  sdk   v3 https://github.c

微信小程序开发:设置消息推送

开发设置中,启用并设置消息推送配置后,用户发给小程序的消息以及开发者需要的事件推送,都将被微信转发至该服务器地址中. 不过照着说明去操作,即使按照最简单的明文方式去设置,还是提示Token验证失败.仔细研究说明,其实服务器验证过程很简单,用Get发来一个连接,然后在自己的页面中去检验,不想做也可以先不做,直接返回echostr即可.关键在,怎么返回,开始我还以为必须要按照xml或者json返回,试了半天,其实很简单,清空所有其他输出,直接返回echostr即可. Response.Clear()

redis 学习 五 消息推送

<?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 发布 * * @example php publish.php */ //发布 $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); $redis->publish('msg', '来自msg频道的推送'); echo "msg频道消息推送成功- \n"; $re

Android消息推送:手把手教你集成小米推送

前言 在Android开发中,消息推送功能的使用非常常见. 为了降低开发成本,使用第三方推送是现今较为流行的解决方案. 今天,我将手把手教大家如何在你的应用里集成小米推送 该文档基于小米推送官方Demo,并给出简易推送Demo 看该文档前,请先阅读我写的另外两篇文章: 史上最全解析Android消息推送解决方案 Android推送:第三方消息推送平台详细解析 目录 1. 官方Demo解析 首先,我们先对小米官方的推送Demo进行解析. 请先到官网下载官方Demo和SDK说明文档 1.1 Demo

MPush开源消息推送系统:简洁、安全、支持集群

引言 由于之前自己团队需要一个消息推送系统来替换JPUSH,一直找了很久基本没有真正可用的开源系统 所有就直接造了个轮子,造轮子的时候就奔着开源做打算的,只是后来创业项目失败一直没时间整理 这一套代码,最近比较闲就拿出来给开源做点贡献. 作为Java版的开源推送系统,MPUSH还是有很多不错的设计的,特别是对想自己搭建一套推送系统的团队 是有很大的借鉴意义的.当然开源出来也是不想曾经做过的工作白白浪费掉,特别希望对这方面有兴趣的同学 来一起把这套东西做的更好,服务更多的用户! 项目主页 http

AngularJS+ASP.NET MVC+SignalR实现消息推送

原文:http://www.mincoder.com/article/4565.shtml 背景 OA管理系统中,员工提交申请单,消息实时通知到相关人员及时进行审批,审批之后将结果推送给用户. 技术选择 最开始发现的是firebase,于是很兴奋的开始倒腾起来.firebase用 起来倒是简单:引用一个js即可,按官网上的教程很快便应用到了项目中.第二天打开项目发现推送功能不好使了,这是为何?最后发现firebase官网打 不开了...难道firebase被google收了也会被天朝给墙掉?也许

Asp.net SignalR 实现服务端消息推送到Web端

原文:http://www.cnblogs.com/wintersun/p/4148223.html 之前的文章介绍过Asp.net SignalR,  ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.  今天我们来实现服务端消息推送到Web端,   首先回顾一下它抽象层次图是这样的: 实际上 Asp.net SignalR 2 实现 服务端消息推送到Web端, 更加简单. 为了获取更好的可伸缩性, 我们引入消息队列, 看如下

Shuttle ESB实现局域网消息推送

ESB全称Enterprise Service Bus,即企业服务总线.它是传统中间件技术与XML.Web服务等技术结合的产物. ESB的出现改变了传统的软件架构,可以提供比传统中间件产品更为廉价的解决方案,同时它还可以消除不同应用之间的技术差异,让不同的应用服务器协调运作,实现了不同服务之间的通信与整合. 看吧,ESB的功能是如此强大.在java中常用的是Mule ESB,而到了.Net,Shuttle ESB作为一种新生的ESB正在慢慢的被人们所接受.下面通过一个实例讲解Shuttle ES

Android消息推送机制

1.推送方式基础知识: 当我们开发需要和服务器交互的应用程序时,基本上都需要获取服务器端的数据,比如<地震应急通>就需要及时获取服务器上最新的地震信息.要获取服务器 上不定时更新的信息一般来说有两种方法,第一种是客户端使用Pull(拉)的方式,隔一段时间就去服务器上获取信息,看是否有更新的信息出现.第二种就是 服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上.? 虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,但是明显来说Push is