android xmpp实现消息xmpp推送原理,为什么在手机后台运行一段时间就会掉线,而且不会重新登录

Android消息推送方案 - big-dream - 博客园
随笔 - 3, 文章 - 1, 评论 - 0, 引用 - 0
1、服务器端采用Openfire开源服务器(项目地址:)
2、安卓端采用asmack包(项目地址:)连接Openfire服务器。
3、安卓端连接配置代码:
package com.android.
import org.jivesoftware.smack.C
import org.jivesoftware.smack.ConnectionC
import org.jivesoftware.smack.XMPPC
import org.jivesoftware.smack.provider.PrivacyP
import org.jivesoftware.smack.provider.ProviderM
import org.jivesoftware.smackx.GroupChatI
import org.jivesoftware.smackx.PrivateDataM
import org.jivesoftware.smackx.bytestreams.socks5.provider.BytestreamsP
import org.jivesoftware.smackx.packet.ChatStateE
import org.jivesoftware.smackx.packet.LastA
import org.jivesoftware.smackx.packet.OfflineMessageI
import org.jivesoftware.smackx.packet.OfflineMessageR
import org.jivesoftware.smackx.packet.SharedGroupsI
import org.jivesoftware.smackx.provider.AdHocCommandDataP
import org.jivesoftware.smackx.provider.DataFormP
import org.jivesoftware.smackx.provider.DelayInformationP
import org.jivesoftware.smackx.provider.DiscoverInfoP
import org.jivesoftware.smackx.provider.DiscoverItemsP
import org.jivesoftware.smackx.provider.MUCAdminP
import org.jivesoftware.smackx.provider.MUCOwnerP
import org.jivesoftware.smackx.provider.MUCUserP
import org.jivesoftware.smackx.provider.MessageEventP
import org.jivesoftware.smackx.provider.MultipleAddressesP
import org.jivesoftware.smackx.provider.RosterExchangeP
import org.jivesoftware.smackx.provider.StreamInitiationP
import org.jivesoftware.smackx.provider.VCardP
import org.jivesoftware.smackx.provider.XHTMLExtensionP
import org.jivesoftware.smackx.search.UserS
import android.util.L
public class XMPPConnectionSet {
public static XMPPC
private static String host = "192.168.19.64";
Connection.DEBUG_ENABLED = true;
ConnectionConfiguration connectionC
connectionConfig = new ConnectionConfiguration(host, 5222, "");
connectionConfig.setReconnectionAllowed(true);
connectionConfig.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
connectionConfig.setSASLAuthenticationEnabled(false);
connectionConfig.setCompressionEnabled(false);
connectionConfig.setTruststorePath("/system/etc/security/cacerts.bks");
connectionConfig.setTruststorePassword("changeit");
connectionConfig.setTruststoreType("bks");
connection = new XMPPConnection(connectionConfig);
} catch (Exception e) {
Connection.DEBUG_ENABLED = true;
ProviderManager pm = ProviderManager.getInstance();
configure(pm);
public static void configure(ProviderManager pm) {
// Private Data Storage
pm.addIQProvider("query", "jabber:iq:private",
new PrivateDataManager.PrivateDataIQProvider());
pm.addIQProvider("query", "jabber:iq:time",
Class.forName("org.jivesoftware.smackx.packet.Time"));
} catch (ClassNotFoundException e) {
Log.w("TestClient",
"Can't load class for org.jivesoftware.smackx.packet.Time");
// Roster Exchange
pm.addExtensionProvider("x", "jabber:x:roster",
new RosterExchangeProvider());
// Message Events
pm.addExtensionProvider("x", "jabber:x:event",
new MessageEventProvider());
// Chat State
pm.addExtensionProvider("active",
"http://jabber.org/protocol/chatstates",
new ChatStateExtension.Provider());
pm.addExtensionProvider("composing",
"http://jabber.org/protocol/chatstates",
new ChatStateExtension.Provider());
pm.addExtensionProvider("paused",
"http://jabber.org/protocol/chatstates",
new ChatStateExtension.Provider());
pm.addExtensionProvider("inactive",
"http://jabber.org/protocol/chatstates",
new ChatStateExtension.Provider());
pm.addExtensionProvider("gone",
"http://jabber.org/protocol/chatstates",
new ChatStateExtension.Provider());
pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im",
new XHTMLExtensionProvider());
// Group Chat Invitations
pm.addExtensionProvider("x", "jabber:x:conference",
new GroupChatInvitation.Provider());
// Service Discovery # Items
pm.addIQProvider("query", "http://jabber.org/protocol/disco#items",
new DiscoverItemsProvider());
// Service Discovery # Info
pm.addIQProvider("query", "http://jabber.org/protocol/disco#info",
new DiscoverInfoProvider());
// Data Forms
pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider());
// MUC User
pm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user",
new MUCUserProvider());
// MUC Admin
pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin",
new MUCAdminProvider());
// MUC Owner
pm.addIQProvider("query", "http://jabber.org/protocol/muc#owner",
new MUCOwnerProvider());
// Delayed Delivery
pm.addExtensionProvider("x", "jabber:x:delay",
new DelayInformationProvider());
// Version
pm.addIQProvider("query", "jabber:iq:version",
Class.forName("org.jivesoftware.smackx.packet.Version"));
} catch (ClassNotFoundException e) {
// Not sure what's happening here.
pm.addIQProvider("vCard", "vcard-temp", new VCardProvider());
// Offline Message Requests
pm.addIQProvider("offline", "http://jabber.org/protocol/offline",
new OfflineMessageRequest.Provider());
// Offline Message Indicator
pm.addExtensionProvider("offline",
"http://jabber.org/protocol/offline",
new OfflineMessageInfo.Provider());
// Last Activity
pm.addIQProvider("query", "jabber:iq:last", new LastActivity.Provider());
// User Search
pm.addIQProvider("query", "jabber:iq:search", new UserSearch.Provider());
// SharedGroupsInfo
pm.addIQProvider("sharedgroup",
"http://www.jivesoftware.org/protocol/sharedgroup",
new SharedGroupsInfo.Provider());
// JEP-33: Extended Stanza Addressing
pm.addExtensionProvider("addresses",
"http://jabber.org/protocol/address",
new MultipleAddressesProvider());
// FileTransfer
pm.addIQProvider("si", "http://jabber.org/protocol/si",
new StreamInitiationProvider());
pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams",
new BytestreamsProvider());
// pm.addIQProvider("open", "http://jabber.org/protocol/ibb",
// new IBBProviders.Open());
// pm.addIQProvider("close", "http://jabber.org/protocol/ibb",
// new IBBProviders.Close());
// pm.addExtensionProvider("data", "http://jabber.org/protocol/ibb",
// new IBBProviders.Data());
// Privacy
pm.addIQProvider("query", "jabber:iq:privacy", new PrivacyProvider());
pm.addIQProvider("command", "http://jabber.org/protocol/commands",
new AdHocCommandDataProvider());
pm.addExtensionProvider("malformed-action",
"http://jabber.org/protocol/commands",
new AdHocCommandDataProvider.MalformedActionError());
pm.addExtensionProvider("bad-locale",
"http://jabber.org/protocol/commands",
new AdHocCommandDataProvider.BadLocaleError());
pm.addExtensionProvider("bad-payload",
"http://jabber.org/protocol/commands",
new AdHocCommandDataProvider.BadPayloadError());
pm.addExtensionProvider("bad-sessionid",
"http://jabber.org/protocol/commands",
new AdHocCommandDataProvider.BadSessionIDError());
pm.addExtensionProvider("session-expired",
"http://jabber.org/protocol/commands",
new AdHocCommandDataProvider.SessionExpiredError());
System.out.println("---------消息监听pm");
4、登陆openfire代码
if (!XMPPConnectionSet.connection.isConnected()) {
System.out.println("-----准备连接");
XMPPConnectionSet.connection.connect();
System.out.println("-----连接成功");
XMPPConnectionSet.connection.login(name, pwd);
System.out.println("-----登陆成功");
// 登陆成功后,通知服务器用户处于在线状态
Presence presence = new Presence(Presence.Type.available);
XMPPConnectionSet.connection.sendPacket(presence);
_xmppMessageMgr = new XmppMessageManager(this);
_xmppMessageMgr.initialize();
System.out.println("-----messageservice start");
}catch (org.jivesoftware.smack.XMPPException e) {
System.out.println("-----messageservice false:"+e.getMessage());
5、监听openfire发送的消息
XMPPConnectionSet.connection.addPacketListener(new PacketListener() {
public void processPacket(Packet packet) {
Message message = (Message)
String str = message.getBody();Android端服务器推送技术原理分析及XMPP简单的使用 - 推酷
Android端服务器推送技术原理分析及XMPP简单的使用
xmpp协议起源于
著名的Linux即时通讯服务服务器
jabber,有时候我们会把xmpp协议也叫jabber协议,其实这是不规范的,xmpp是个协议,而jabber是个服务器,因为jabber开源,设计精良,安全,稳定,跨语言,跨平台,封装开发简便,越来越多人开始使用它,并且逐步完善,不久它便形成了一个强大的标准化体系,
Google GTalk、Pidgin、PSI、Spark、Pandion、
MSN、Yahoo、ICQ..诸如此类一些软件在这个强大的标准体系下实现了互联.那么XMPP到底是什么意思,用通俗的话讲它和基于xml格式的一些协议原理差不多,只不过是个针对服务器的软件协议罢了。
&&&& 那么在java领域是否存在一个类似jabber那么强大开源稳定的也完美支持xmpp协议的服务器呢?答案有的,那便是openfire,openfire
是纯java开发的基于XMPP的协议,目前最终版本锁定在了2011年openfire 3.7,它一共有linux windows mac 三个版本,安装也非常简单,openfire这个服务器是个开放式的平台,它内部集成的服务包括即时通讯服务,会议室服务,用户安全验证和管理服务,搜索服务,组织机构服务,会话服务,这几大服务都有相应的管理类和对外接口,它的二次开发和扩展都是在插件基础上直接嫁接进去的,早期有很多第三方为他做了插件,有语音服务,red5视频服务,邮件服务等等,语音和视频在openfire上一直是个鸡肋,没有非常好的解决方案,而做这些插件的大部分都停止更新,大家如果选用openfire做视频和语音还要慎重!抛开这些插件,openfire在IM及时通讯上还是相当强大稳定的,不少公司拿它来做二次开发!但即便如此openfire的二次开发成本还是比较高昂的,笔者曾经成功费了九牛二虎之力将源码环境搭建起来,并成功将它与我们JAVAEE 经典架构SSH成功组装,用openfire的桌面客户端spark软件和android开源xmpp客户端Beam软件,web端聊天软件Claros Chat享受了一把在自己服务器上“随时随地聊天”,不过这些都是实验阶段,距离成熟可用还很远!研究技术可以这么勾兑尝试,真的给人用可不能这么随意,我们还是要挖掘真正对我们有用的价值!
&&&& openfire过于庞大繁复,许多对我们来说都是没什么用的,甚至要砍掉改造,能不能有精简的xmpp服务器呢?答案是有的,androidpn,笔者认真比对过openfire和androidpn的源码,最后惊奇的发现,原来它就是从openfire里面庖丁解牛出来的一部分,做这件事的人非常的了不起,为我们省了很大力气,在此感谢他的开源和共享精神,那么
androidpn分离出来的是消息推送服务,简言之就是从服务端向android客户端推送消息的服务,因为
openfire的源码架构是在jetty基础上建立的,它的启动和部署方式和我们传统的服务器tomcat和weblogic等有点区别,所以androidpn也有jetty的影子,在和我们传统架构组合的时候还要再把它和jetty拆开,
&androidpn的搭建和使用网上的教程很多,大家可以发现大部分千篇一律,出现一个OK界面就没了,堂而皇之的写上原创,有的只是改了下hello world,如此糊弄,实在难为所用!
&& androidpn消息推送采用的是apache的mina框架做的,服务端和客户端两边都有监听,也就是我们所说的socket编程,有人说socket编程有什么难的,就那么回事,其实不然,我们平时写的socket聊天都只是在局域网的,但是要穿透路由和防火墙,让信息安全及时的传送到另一个网关的局域网电脑中,就不是一件简单的活了,其中涉及到在nat上打洞,还有线程,断网重连,安全加密等等,那么androidpn配合mina相当于把这些活都干了,那么我们要的干活就相对比较精细了,第一学习mina的安装配置的规则,第二学习xmpp协议组装和解析的规则,第三学习androidpn推和收消息的核心代码,如此三点我们便能灵活驾驭住androidpn出现再大的问题自己也能动手去调了。在和spring整合的时候大家要注意不要让mina服务启动2次,笔者整合时候无意发现在linux64位系统,weblogic上启动时候总是报5222已经被占用,反复查看代码发现mina在随web容器启动过一次5222端口后,xmppserver类中的start方法中ClassPathXmlApplicationContext类又加载了一次spring配置,导致端口被重复开启两次,后来将spring配置重新修了下,保证配置了mina的xml只被加载一次,在相同加载模式下spring的bean单例确实不会重复创建,但是ClassPathXmlApplicationContext加载模式必定会导致mina端口实例连同所有实例重新被加载,毕竟不在一个内存中管理,统一管理即可解决问题!网上现在也有不少androidpn版本,五花八门什么都有,里面到底有没问题,改了什么没改什么都不知道,基本上已经追溯不到原创到底是谁了,索性就只能从国外的一个网站上下了一个比较可靠的版本自己动手去量身改造,终于出了一个比较稳定版本。而且笔者把离线消息也做了进去,用户只要没收到提醒,当他恢复连接时离线消息就会被推送过来。
&&&& 对于消息提醒来说,它仅仅是个notification,许多人非要把业务数据也做进去,更有夸张好几兆的xml数据就这么硬塞提醒过去,这种做法本身就背离了设计的初衷,非要把跑车当牛车使能不出问题吗?其实业务数据还是用http拉比较好,xmpp及时的前提是用资源消耗作为代价的,我们能适度就适度用,用好用稳就行!如果这样就结束了还不算太华丽,笔者教大家如何将自己家里的局域网电脑免费发布到外网作为服务器,或者你有了答案,申请个花生壳账户就可以送一个免费的域名,将花生壳域名客户端在你的客户端启动起来,然后打开你的路由管理,在转发规则中-&虚拟服务器-&添加新条目,服务器端口号填写5222 ip填写你的内网地址,再添加一个条目,服务器端口填写你的中间件端口,我的是8080,ip填写你的内网地址,最后重启路由,好了现在把你的花生壳域名输入到浏览器 xxx.xicp.net:8080/xxx 就可以随时随地在外网使用消息推服务了,最后将你的手机端配置改成花生壳域名
xxx.xicp.net,就可以收到消息。
项目源码下载:
搭建步骤:
1.android端找到res/raw/androidpn.properties文件修改服务器ip地址,不要写localhost,写绝对ip地址
2.服务端找到resources/jdbc.properties 在mysql中新建一个数据库apn,并将连接指向该库,设置用户名和密码,库表会随服务启动的时候自动创建
3.先启动服务,再打开android客户端,点击连接即可
原创参阅文献
push-notification
Claros chat&
androidpnsourceforge&&&
android消息推送解决方案
xmpp协议实现原理介绍&
最后,希望转载的朋友能够尊重作者的劳动成果,加上转载地址!
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致&>&&>&&>&&>&android xmpp的消息推送
android xmpp的消息推送
上传大小:652KB
android 基于xmpp的消息图推送
客服端和服务器端都在里面
综合评分:3.7(10位用户评分)
所需积分:3
下载次数:38
审核通过送C币
创建者:xiaoyaoyou1212
创建者:nigelyq
创建者:jin80506
课程推荐相关知识库
上传者其他资源上传者专辑
移动开发热门标签
VIP会员动态
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
android xmpp的消息推送
会员到期时间:
剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:TA的最新馆藏

我要回帖

更多关于 ios xmpp消息推送 的文章

 

随机推荐