皮肤 颜色
板式
宽屏 窄屏
您的位置:合度 > 动态 > 技术选摘 > >

使用Androidpn实现Android消息推送

发表日期:2015-04-11    文章编辑:本站编辑   来源:网络    浏览次数:
 

事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。

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

androidpn是一个基于XMPP协议的java开源Android push notification实现。

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,Auth Manager,PresenceManager以及Notification Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器向客户端推送消息功能。
-----------------------------------------------
首先我们比较一下目前可以实现推送的三种方式:

1.客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送,这是去服务端拽数据。但是实现简单,主要缺点:耗电等
2.Google的C2DM,具体不细说,缺点,服务器在国外,不是很稳定。
3.XMPP协议,它是一种基于XML的传递协议,具有很强的灵活性和可扩展性。它的特点是将复杂性从客户端转移到了服务器端。


androidpn是基于XMPP协议的用于向Android客户端推送文本信息的一套开源的工具。它帮我们做了那些维护Socket长连接等复杂的事情。


1.下载androidpn服务器端与客户端的Demo并运行;一共包含三个zip文件:
1)androidpn-client-0.5.0.zip
2)androidpn-demoapp-0.5.0.zip
3)androidpn-server-0.5.0-bin.zip
   
2.启动服务器端与客户端,通过Web页面推送。XMPP在android客户端上的应用。分两部分实现:服务端搭建和客户端实现
服务端搭建:如果想测试一下功能,可以直接用搭建好的服务就行,解压androidpn-server-0.5.0-bin.zip,进入bin目录下双击run.bat,直接运行服务;
在浏览器上输入 http://127.0.0.1:7070  就进入管理界面。

遇到问题:
a.在win7环境下,双击运行run.bat闪退
解决办法:点击run.bat,右键‘编辑’,在文件末尾添加'pause';
b.运行run.bat出现’Error: JAVA_HOME environment variable not set, Androidpn not started.‘
原因:没有配置正确的环境变量;
解决办法:在’我的电脑‘-属性-系统设置-环境变量,配置环境变量JAVA_HOME = jdk安装目录,地址写到jdk目录下bin的上一级,如C:\jdk;或者也可以编辑run.bat,把内容中的’JAVA_HOME‘强制替换成jdk目录地址
c.运行run.bat出现’Error: no `server' JVM at `C:\jdk\bin\server\jvm.dll'.‘
原因:jdk-bin-server目录下缺少jvm.dll文件
解决办法:默认安装jdk完成后,在bin目录下有client目录,但是没有server目录,在client目录下有jvm.dll文件,可以直接新建server文件夹,将jvm.dll文件拷贝进去

客户端实现:

解压androidpn-client-0.5.0.zip,导入eclipse工程,运行前更改一处IP地址,修改res/raw/androidpn.properties文件中的xmppHost为xmppHost=10.0.2.2
原因:模拟器访问本机需要改成10.0.2.2,下面为SDK中IP说明。
[模拟器把10.0.2.2认为是所在主机的地址,127.0.0.1是模拟器本身的回环地址,10.0.2.1表示网关地址,10.0.2.3表示DNS地址,10.0.2.15表示目标设备的网络地址]

运行android程序,从服务端发送消息,客户端就可以收到推送消息了。

遇到问题:
a.运行时出现’java.lang.NoClassDefFoundError: org.androidpn.client.PersistentConnectionListener‘异常
原因:更新了Android SDK 和ADT 到 R17 以后出现了一个问题,就是原来所有引入第三方的jar文件的项目,运行到一旦调用了第三方jar文件里的类的地方,都会出现类似
E/AndroidRuntime : java.lang.NoClassDefFoundError 的错误。
解决方法:将所有的第三方jar文件从 standard Java build path中移除;右键项目名 > Properties > Java Build Path > tab Libraries >将 “Android X.X” and the “Android Dependencies”之外的所有jar文件引用全部去除重命名lib文件夹为libs;ibs库文件夹就能被 Android plugin 添加到  “Android Dependencies” 条目里。;Clean the project 
b.Android 中出现这样的警告 Exported service does not require permission 
解决办法:加上这个就可以了android:exported="false";比如: <service android:name="MusicService"  android:exported="false">

原文链接:http://blog.csdn.net/jjmm2009/article/details/8946540?reload

相关文章推荐

  
Socket 和 WebSocket 有哪些区别和联系? WebSocket 和 HTML5 是什么关系? 必须在浏览器中才能使用...
  
简介 响应式Web设计 是一种创建Web应用程序的新方法。一旦采用 响应式Web设计 创建出应用程序...
  
其实对于我们一般理解的计算机内存,它算是CPU与计算机打交道最频繁的区域,所有数据都是...
  
用div做成表格的形式,把标签中间的空格都去掉就可以了...
  
看下面的代码,其中连接池采用的c3p0,配置文件省略 import java.sql.Connection; import org.springframe...
  
html5shiv让IE6-IE8支持HTML5标签 越来越多的站点开始使用 HTML5 标签。但是目前的情况是还有很多人...
  
缓存 是实际工作中非常常用的一种提高性能的方法, 我们会在许多场景下来使用缓存。 本文通...
  
主要几个框架或者插件是如何实现异步加载事件响应的。 一.LABjs 这个项目位于github上面,其本...
  
为了防止恶意用户发布恶意内容,我们的安全分析浏览器都在虚拟机上运行。这使我们能够确...