web服务器推送信息到android虚拟主机服务器怎么使用百度api推送


web服务器推送信息到android虚拟主机服务器怎么使用百度api推送

在开发Android和iPhone应用程序时,咱们每每须要从服务器不定的向手机客户端即时推送各类通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,但是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究。php

在Android手机平台上,Google提供了C2DM(CloudtoDeviceMessaging)服务,起初我就是准备采用这个服务来实现本身手机上的推送功能。css

AndroidCloudtoDeviceMessaging(C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,容许服务器能够通知移动应用程序直接与服务器进行通讯,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消息。java

2)C2DM须要依赖于Google官方提供的C2DM服务器,因为国内的网络环境,这个服务常常不可用,若是想要很好的使用,咱们的AppServer必须也在国外,这个恐怕不是每一个开发者都可以实现的;github

有了上述两个使用上的制约,致使我最终放弃了这个方案,不过我想利用另一篇文章来详细的介绍C2DM的框架以及客户端和AppServer的相应设置方法,能够做为学习与参考之用。spring

即然C2DM没法知足咱们的要求,那么咱们就须要本身来实现Android手机客户端与AppServer之间的通讯协议,保证在AppServer想向指定的Android设备发送消息时,Android设备可以及时的收到。下面我来介绍几种常见的方案:api

1)轮询:应用程序应当阶段性的与服务器进行链接并查询是否有新的消息到达,你必须本身实现与服务器之间的通讯,例如消息排队等。并且你还要考虑轮询的频率,若是太慢可能致使某些消息的延迟,若是太快,则会大量消耗网络带宽和电池。浏览器

2)SMS:在Android平台上,你能够经过拦截SMS消息而且解析消息内容来了解服务器的意图。这是一个不错的想法,我就见过采用这个方案的应用程序。这个方案的好处是,能够实现彻底的实时操做。可是问题是这个方案的成本相对比较高,你很难找到免费的短消息发送网关,关于这个方案的实现,能够参考以下连接:/apis/mobile-java-push/。服务器

3)持久链接:这个方案能够解决由轮询带来的性能问题,可是仍是会消耗手机的电池。Apple的推送服务之因此工做的很好,是由于每一台手机仅仅保持一个与服务器之间的链接,事实上C2DM也是这么工做的。不过这个方案也存在不足,就是咱们很难在手机上实现一个可靠的服务。Android操做系统容许在低内存状况下杀死系统服务,因此你的通知服务极可能被操做系统Kill掉了。

前两个方案存在明显的不足,第三个方案也有不足,不过咱们能够经过良好的设计来弥补,以便于让该方案能够有效的工做。毕竟,咱们要知道GMail,GTalk以及GoogleVoice均可以实现实时更新的。

MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。

wmqtt.jar是IBM提供的MQTT协议的实现。你能够从以下站点下载它。你能够将该jar包加入你本身的Android应用程序中。

ReallySmallMessageBroker(RSMB),他是一个简单的MQTT代理,一样由IBM提供。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。

send_mqtt.php是一个经过POST接收消息而且经过SAM将消息发送给RSMB的PHP脚本。

能够从GitHub上下载实例应用。运行该应用之后,经过手机浏览器访问/demo/android-push/,在第一个输入框输入设备ID,在第二个输入框输入想要发送的消息内容,按下“SendPushMessage”按钮,你就应该能够看到手机上收到了通知了。你也能够从这个GitHub地址上下载android-push源代码,它包含了send_mqtt.php脚本。

这是我在项目中采用的方案。事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。

XMPP(可扩展通信和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终容许因特网用户向因特网上的其余任何人发送即时消息。

androidpn是一个基于XMPP协议的java开源Androidpushnotification实现。它包含了完整的客户端和服务器端。通过源代码研究我发现,该服务器端基本是在另一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,因此整个研究过程基本都是读源码。它的实现示意图以下:

androidpn客户端须要用到一个基于java的开源XMPP协议包asmack,这个包一样也是基于openfire下的另一个开源项目smack,不过咱们不须要本身编译,能够直接把androidpn客户端里面的asmack.jar拿来使用。客户端利用asmack中提供的XMPPConnection类与服务器创建持久链接,并经过该链接进行用户注册和登陆认证,一样也是经过这条链接,接收服务器发送的通知。

androidpn服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与openfire是不一样的。Androidpn服务器包含两个部分,一个是侦听在5222端口上的XMPP服务,负责与客户端的XMPPConnection类进行通讯,做用是用户注册和身份认证,并发送推送通知消息。另一部分是Web服务器,采用一个轻量级的HTTP服务器,负责接收用户的Web请求。服务器架构以下:

最上层包含四个组成部分,分别是SessionManager,AuthManager,PresenceManager以及NotificationManager。SessionManager负责管理客户端与服务器之间的会话,AuthManager负责客户端用户认证管理,PresenceManager负责管理客户端用户的登陆状态,NotificationManager负责实现服务器向客户端推送消息功能。

这个解决方案的最大优点就是简单,咱们不须要象C2DM那样依赖操做系统版本,也不会担忧某一天Google服务器不可用。利用XMPP协议咱们还能够进一步的对协议进行扩展,实现更为完善的功能。

采用这个方案,咱们目前只能发送文字消息,不过对于推送来讲通常足够了,由于咱们不能期望经过推送获得全部的数据,通常状况下,利用推送只是告诉手机端服务器发生了某些改变,当客户端收到通知之后,应该主动到服务器获取最新的数据,这样才是推送服务的完整实现。

转自:/peijiangping1989/article/details/7221172