转自:http://blog.csdn.net/nomousewch/article/details/8088277

最近好像有不少朋友关注Android客户端消息推送的实现,我在之前的项目中用到过Java PC客户端消息推送,从原理讲上应该是一致的,在这里分享一下个人的心得。

  • 消息推送实现原理
        这里的消息推送,通常是指由服务器端向客户端发送的一些消息,比如待办事宜、新闻等等。
        从技术角度来看,消息推送本质上是基于TCP/IP的网络IO流传输,只不过这个IO流看起来由服务器发起,从上面的条件来看,一个基本的消息推送框架的Java实现应该是这样的:有一个用Java NIO实现的服务器,多个用socket连接到此服务器的客户端,然后之间用二进制流传输信息。说起来简单,实现起来却很不容易,所幸基于XMPP协议的openfire刚好符合上述条件,不仅如此,这种方案还有如下优点:
  1. openfire是开源的,用Java写的,这对Java程序员来说很重要。。。
  2. XMPP协议采用XML流传输消息,可读性和可扩展性优秀,便于我们定义自己的推送消息结构。
  3. XMPP协议在PC和Android分别有对应的协议实现smack和asmack,不用我们写XML协议解析。
        那么具体如何实现在openfire中推送消息呢?我的想法是这样的:
        当两个用户使用openfire中聊天时,消息是从用户A经过服务器流向用户B,那么我们可以想象有消息中心这么一个用户,它的作用就是当我们系统有需要时,向某个用户发一条相应的消息,我们的客户端收到这样一个用户的消息时,就将其当做系统消息,这样就实现了简单的消息推送。
        还有一个问题就是,系统怎么知道向哪个用户推送消息、什么时候推送消息,我们可以用http post的方式通知openfire服务器,用参数指定消息体和发送对象。
  • 使用openfire实现消息推送
         第一步,使用openfire进行消息推送的前提是在openfire系统中注册账号,有关openfire账号整合自定义数据库请看我的另一篇文章http://blog.csdn.net/nomousewch/article/details/7546083,这里就不说了。
         第二步,在openfire中建立一个插件,这里贴一下核心代码:
	public static void pushMessage(JID to, JID from, String body,
String subject) {
Message message = new Message();
message.setFrom(from);
message.setTo(to);
message.setBody(body); if (StringUtils.isNotBlank(subject)) {
message.setSubject(subject);
} XMPPServer.getInstance().getRoutingTable().routePacket(to, message, true);
}

第三步,在插件中定义一个Servlet,调用上述方法。

         第四步,在业务系统中用http client调用Servlet,来向指定用户推送消息。

基于XMPP协议(openfire服务器)的消息推送实现的更多相关文章

  1. ZH奶酪:基于ionic.io平台的ionic消息推送功能实现

    Hybrid App越来越火,Ionic的框架也逐渐被更多的人熟知. 在mobile app中,消息推送是很必要的一个功能. 国内很多ionic应用的推送都是用的极光推送,最近研究了一下Ionic自己 ...

  2. 基于ajax与msmq技术的消息推送功能实现

    周末在家捣鼓了一下消息推送的简单例子,其实也没什么技术含量,欢迎大伙拍砖.我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图: 先说说这个ajax长轮询,多长时 ...

  3. 拾人牙慧篇之——基于HTML5中websocket来实现消息推送功能

    一.写在前面 要求做一个,后台发布信息,前台能即时得到通知的消息推送功能.网上搜了也有很多方式,ajax的定时询问,Comet方式,Server-Sent方式,以及websocket.表示除了定时询问 ...

  4. Android 基于Netty的消息推送方案之Hello World(一)

    消息推送方案(轮询.长连接) 轮询 轮询:比较简单的,最容易理解和实现的就是客户端去服务器上拉信息,信息的及时性要求越高则拉信息的频率越高.客户端拉信息的触发可以是一些事件,也可以是一个定时器,不断地 ...

  5. [Python]实现XMPP协议即时通讯发送消息功能

    #-*- coding: utf-8 -*- __author__ = 'tsbc' import xmpp import time #注意帐号信息,必须加@域名格式 from_user = 'che ...

  6. 基于socket.io的实时消息推送

    用户访问Web站点的过程是基于HTTP协议的,而HTTP协议的工作模式是:请求-响应,客户端发出访问请求,服务器端以资源数据响应请求. 也就是说,服务器端始终是被动的,即使服务器端的资源数据发生变化, ...

  7. 分分钟搞定IOS远程消息推送

    一.引言 IOS中消息的推送有两种方式,分别是本地推送和远程推送,本地推送在http://my.oschina.net/u/2340880/blog/405491这篇博客中有详细的介绍,这里主要讨论远 ...

  8. 未读消息(小红点),前端与 RabbitMQ实时消息推送实践,贼简单~

    前几天粉丝群里有个小伙伴问过:web 页面的未读消息(小红点)怎么实现比较简单,刚好本周手头有类似的开发任务,索性就整理出来供小伙伴们参考,没准哪天就能用得上呢. 之前在 <springboot ...

  9. Android消息推送(二)--基于MQTT协议实现的推送功能

    国内的Android设备,不能稳定的使用Google GCM(Google Cloud Messageing)消息推送服务. 1. 国内的Android设备,基本上从操作系统底层开始就去掉了Googl ...

随机推荐

  1. 【原】iOS学习之KVC原理

    1. KVC的实现原理 遍历字典里面所有的key,以name为例 去模型中查找有没有setName:方法,有就直接调用赋值 假如没有找到setName:方法,就会继续查找有没有_name属性,有就_n ...

  2. Activiti工作流学习(二)流程实例、执行对象、任务

    一.前言 前面说明了基本的流程部署.定义,启动流程实例等基本操作,下面我们继续来学习流程实例.执行对象.任务. 二.流程实例.执行对象说明 整个Activiti的生命周期经过了如下的几个步骤: 1.流 ...

  3. Android 在线更新apk

    1.获取当前包的信息: 1 PackageManager manager = Main.this.getPackageManager(); 2 try { 3 PackageInfo info = m ...

  4. html5 可以讓使用者輸入url網址 ,去play影片

    <html> <head> <title>Simple Video Example</title> <script> function pl ...

  5. java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries

    在已经搭建好的集群环境Centos6.6+Hadoop2.7+Hbase0.98+Spark1.3.1下,在Win7系统Intellij开发工具中调试Spark读取Hbase.运行直接报错: ? 1 ...

  6. jquery中prop()方法和attr()方法的区别浅析

    官方例举的例子感觉和attr()差不多,也不知道有什么区别,既然有了prop()这个新方法,不可能没用吧,那什么时候该用attr(),什么时候该用prop()呢 jquery1.6中新加了一个方法pr ...

  7. Convert between cv::Mat and QImage 两种图片类转换

    在使用Qt和OpenCV混合编程时,我们有时需要在两种图片类cv::Mat和QImage之间进行转换,下面的代码参考了网上这个帖子: //##### cv::Mat ---> QImage ## ...

  8. css中margin-left与left的区别

    研究下拉菜单和弹出菜单时比较所得: 1.直接在css中设置left生效的前提是必须设置父容器position:absolute或relative,如果不设置则会显示为最近一个定位的父对象左边相关的位置 ...

  9. Js闭包常见三种用法

        Js闭包特性源于内部函数可以将外部函数的活动对象保存在自己的作用域链上,所以使内部函数的可以将外部函数的活动对象占为己有,可以在外部函数销毁时依然存有外部函数内的活动对象内容,这样做的好处是可 ...

  10. HTML5 Input 类型

    浏览器支持 Input type IE Firefox Opera Chrome Safari email No 4.0 9.0 10.0 No url No 4.0 9.0 10.0 No numb ...