android如何实现消息推送有哪些方式各自的优缺点是什么
发布时间:2025-05-12 02:59:43 发布人:远客网络
一、android如何实现消息推送有哪些方式各自的优缺点是什么
【答案】:实现消息推送的方式有五种,分别是轮询,SMS,C2DM,MQTT,XMPP最常使用的是XMPP,我们做项目时采用的是XMPP协议
1.XMPP协议,它是一种基于XML的传递协议,具有很强的灵活性和可扩展性。它的特点是将复杂性从客户端转移到了服务器端。GTalk、QQ、IM等都用这个协议。
2.轮询:客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送,而是去服务端拽数据。但是实现简单,主要缺点:耗电,浪费用户流量等
3.Google的C2DM,具体不细说,缺点,服务器在国外,不是很稳定。
4.通过短信方式,但是很难找到免费短信平台
5. MQTT协议, IBM提供的一种推送服务,不太灵活
二、如何采用MQTT协议实现android消息推送
MQTT协议实现android消息推送,我想每个Android开发人员对它应该都是比较熟悉的。 MQ遥测传输(MQTT)是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放、简单、轻量、易于实现。这些特点使它适用于受限环境。例如,但不仅限于此:网络代价昂贵,带宽低、不可靠。在嵌入设备中运行,处理器和内存资源有限。该协议的特点有:使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。对负载内容屏蔽的消息传输。使用 TCP/IP提供网络连接。有三种消息发布服务质量:“至多一次”,消息发布完全依赖底层 TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。“至少一次”,确保消息到达,但消息重复可能会发生。“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。小型传输,开销很小(固定长度的头部是 2字节),协议交换最小化,以降低网络流量。使用 Last Will和 Testament特性通知有关各方客户端异常中断的机制MQTT最简单的使用包括两种,一种是发消息,一种是订阅消息。发消息就是向一个固定IP地址的某个主题发送消息(publish)订阅消息是向服务器端订阅某些主题,当其他客户端向服务器的这个主题广播消息时,那么所有订阅这个主题的客户端就都能收到了MQTT是一项消息传递技术,由IBM再2001年发布。总结一下,机制就是使用一个代理服务器message broker,客户端client连接上这个服务器,然后告诉服务器说,我可以接收哪些类型的消息,同时,client也可以发布自己的消息,这些消息根据协议的内容,可以被其他client获取。只要手机客户端,连上服务器,然后就可以接收和发布消息了,不用自己写socket什么了,低带宽,低耗电量,代码量也少,很简单吧。 package com.pig.test.mqtt;002003 import com.ibm.mqtt.MqttClient;004 import com.ibm.mqtt.MqttException;005 import com.ibm.mqtt.MqttSimpleCallback;006007 public class SubscribeClient{008 private final static String CONNECTION_STRING="tcp://192.168.1.60:1883";009 private final static boolean CLEAN_START= true;010 private final static short KEEP_ALIVE= 30;//低耗网络,但是又需要及时获取数据,心跳30s011 private final static String CLIENT_ID="client1";012 private final static String[] TOPICS={013"Test/TestTopics/Topic1",014"Test/TestTopics/Topic2",015"Test/TestTopics/Topic3",016"tokudu/client1"017};018 private final static int[] QOS_VALUES={0, 0, 2, 0};019020//////////////////021 private MqttClient mqttClient= null;022023 public SubscribeClient(String i){024 try{025 mqttClient= new MqttClient(CONNECTION_STRING);026 SimpleCallbackHandler simpleCallbackHandler= new SimpleCallbackHandler();027 mqttClient.registerSimpleHandler(simpleCallbackHandler);//注册接收消息方法028 mqttClient.connect(CLIENT_ID+i, CLEAN_START, KEEP_ALIVE);029 mqttClient.subscribe(TOPICS, QOS_VALUES);//订阅接主题030031/**032*完成订阅后,可以增加心跳,保持网络通畅,也可以发布自己的消息033*/034035 mqttClient.publish(PUBLISH_TOPICS,"keepalive".getBytes(), QOS_VALUES[0], true);036037} catch(MqttException e){038// TODO Auto-generated catch block039 e.printStackTrace();040}041}042043/**044*简单回调函数,处理client接收到的主题消息045*@author pig046*047*/048 class SimpleCallbackHandler implements MqttSimpleCallback{ 049050/**051*当客户机和broker意外断开时触发052*可以再此处理重新订阅053*/054@Override055 public void connectionLost() throws Exception{056// TODO Auto-generated method stub057 System.out.println("客户机和broker已经断开");058}059060/**061*客户端订阅消息后,该方法负责回调接收处理消息062*/063@Override064 public void publishArrived(String topicName, byte[] payload, int Qos, booleanretained) throws Exception{065// TODO Auto-generated method stub066 System.out.println("订阅主题:"+ topicName);067 System.out.println("消息数据:"+ new String(payload));068 System.out.println("消息级别(0,1,2):"+ Qos);069 System.out.println("是否是实时发送的消息(false=实时,true=服务器上保留的最后消息):"+ retained);070}071072}073074/**075*高级回调076*@author pig077*078*/079 class AdvancedCallbackHandler implements MqttSimpleCallback{080081@Override082 public void connectionLost() throws Exception{083// TODO Auto-generated method stub084085}086087@Override088 public void publishArrived(String arg0, byte[] arg1, int arg2,089 boolean arg3) throws Exception{090// TODO Auto-generated method stub091092}093094}095096/**097*@param args098*/099 public static void main(String[] args){100// TODO Auto-generated method stub101 new SubscribeClient(""+ i);102103}104105}
三、怎么实现服务器给android客户端主动推送消息
消息推送,就是在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术。推送技术通过自动传送信息给用户,来减少用于网络上搜索的时间。它根据用户的兴趣来搜索、过滤信息,并将其定期推给用户,帮助用户高效率地发掘有价值的信息
当我们开发需要和服务器交互的移动应用时,基本上都需要和服务器进行交互,包括上传数据到服务器,同时从服务器上获取数据。
一般情况下,客户端与服务器之间通讯客户端是主动的,但这就存在一个问题就是一旦服务器数据有更新或者服务器要下发通知给客户端只能等客户端连接的时候才能实现。这种方式使消息失去了实时性。
如何使客户端能够实时的收到服务器的消息和通知,总体来说有两种方式,第一种是客户端使用Pull(拉)的方式,就是隔一段时间就去服务器上获取一下信息,看是否有更新的信息出现。第二种就是服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上。这样,客户端就能自动的接收到消息。
虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,但是明显来说Push方式比Pull方式更优越。因为Pull方式更费客户端的网络流量,更主要的是费电量,还需要我们的程序不停地去监测服务端的变化。
二、几种常见的解决方案实现原理
1)轮询(Pull)方式:客户端定时向服务器发送询问消息,一旦服务器有变化则立即同步消息。
2)SMS(Push)方式:通过拦截SMS消息并且解析消息内容来了解服务器的命令,但这种方式一般用户在经济上很难承受。
3)持久连接(Push)方式:客户端和服务器之间建立长久连接,这样就可以实现消息的及时行和实时性。
在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务。Android Cloud to Device Messaging(C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。
该方案存在的主要问题是C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用。
采用MQTT协议实现Android推送功能也是一种解决方案。MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。
wmqtt.jar是IBM提供的MQTT协议的实现。我们可以从这里()下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现()。
Really Small Message Broker(RSMB),是一个简单的MQTT代理,同样由IBM提供,其查看地址是:。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。SAM是一个针对MQTT写的PHP库。我们可以从这个地址下载它.
Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。
androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。但也存在一些不足之处:
1)比如时间过长时,就再也收不到推送的信息了。
3)如果将消息从服务器上推送出去,就不再管理了,不管消息是否成功到达客户端手机上。
如果我们要使用androidpn,则还需要做大量的工作,需要理解XMPP协议、理解Androidpn的实现机制,需要调试内部存在的BUG。
目前国内、国外有一些推送平台可供使用,但是涉及到收费问题、保密问题、服务质量问题、扩展问题等等,又不得不是我们望而却步。
综合以上论述,在建立Android消息推送方面可谓方案多多,但每一款方案都有其优缺点。但无论如何,还是自己搭建一个推送平台是上策。因为你有、他有不如自己有。
举个例子,在搭建自有推送平台上建议使用《某某Android消息推送组件》。该组不仅可以拿来即用,并且还可以提供源码以便扩展,实现自己的特殊需求。
Android消息推送组件基于XMPP协议实现Android推送。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。