Smack是一个开源,易于使用的XMPP(jabber)客户端类库。优点:简单的,功能强大,给用户发送信息只需三行代码便可完成。缺点:API并非为大量并发用户设计,每个客户要1个线程,占用资源大。
OpenFire是开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器。 Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。
1、首先到网址 http://www.igniterealtime.org 下载OpenFire服务器和Smack jar包

2、安装OpenFire登陆到控制台

   这里设置多长时间关闭闲置连接,可以判断用户是否在线的最长反应时间

3、创建两个测试账号,先用Spark登陆一个账号

4、手机端登陆,使用Service保持连接,并与spark端发送消息,实现双向通信(代码和程序在后面)

5、关键代码

配置连接OpenFire服务器,连接成功后设置响应Linstener和Receiver,这里因业务需求设置ping间隔为10s

     public void connect() {
Log.i(TAG, "connect()");
XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
configBuilder.setHost(SmackConst.XMPP_HOST);
configBuilder.setServiceName(SmackConst.SERVICE_NAME);
configBuilder.setUsernameAndPassword(mUsername, mPassword);
configBuilder.setSecurityMode(SecurityMode.disabled);
mConnection = new XMPPTCPConnection(configBuilder.build());
//Set ConnectionListener here to catch initial connect();
mConnection.addConnectionListener(this);
try {
mConnection.connect();
mConnection.login();
if(mConnection.isAuthenticated()){//登录成功
MyPingManager.setDefaultPingInterval(10);//Ping every 10 seconds
MyPingManager myPingManager = MyPingManager.getInstanceFor(mConnection);
//Set PingListener here to catch connect status
myPingManager.registerPingFailedListener(SmackConnection.this);
setupSendMessageReceiver();
//Set ChatListener here to catch receive message and send NEW_MESSAGE broadcast
ChatManager.getInstanceFor(mConnection).addChatListener(this);
//Set ChatListener here to catch roster change and rebuildRoster
//Roster.getInstanceFor(mConnection).addRosterListener(this);
sendLoginBroadcast(true);
}else{
mConnection.disconnect();
Log.i(TAG, "Authentication failure");
sendLoginBroadcast(false);
}
} catch (Exception e) {
e.printStackTrace();
sendLoginBroadcast(false);
Intent intent = new Intent(mService, mService.getClass());
mService.stopService(intent);
} }

自动重连TimerTask,Ping失败后启动,重连成功后关闭

     private Timer reConnectTimer;
private int delay = 10000;
//pingFailed时启动重连线程
class ReConnectTimer extends TimerTask {
@Override
public void run() {
// 无网络连接时,直接返回
if (getNetworkState(mService) == NETWORN_NONE) {
Log.i(TAG, "无网络连接,"+delay/1000+"s后重新连接");
reConnectTimer.schedule(new ReConnectTimer(), delay);
//reConnectTimer.cancel();
return;
}
// 连接服务器
try {
mConnection.connect();
if(!mConnection.isAuthenticated()){
mConnection.login();
reConnectTimer.cancel();
}
Log.i(TAG, "重连成功");
Intent intent = new Intent(SmackConst.ACTION_RECONNECT_SUCCESS);
mService.sendBroadcast(intent);
} catch (Exception e) {
Log.i(TAG, "重连失败,"+delay/1000+"s后重新连接");
e.printStackTrace();
reConnectTimer.schedule(new ReConnectTimer(), delay);
} }
}

资源地址:https://github.com/liuhaijin/Smack-Openfire

菜鸟一枚,共同学习~~

Smack+OpenFire搭建IM通信,包含心跳和自动重连(Android实现)的更多相关文章

  1. Android基于XMPP Smack Openfire下学习开发IM(五)连接断开重连

    学习过程中大家都碰到过连接被断开的问题给困扰吧,下面教大家如何做到连接断开后,重新连接 首先要创建连接监听器,用来监听连接状态,这里我写了一个类 继承了ConnectionListener,重写了里面 ...

  2. Android基于XMPP Smack openfire 开发的聊天室

    Android基于XMPP Smack openfire 开发的聊天室(一)[会议服务.聊天室列表.加入] http://blog.csdn.net/lnb333666/article/details ...

  3. 倍福TwinCAT3上位机与PLC通信测试(ADS通信) 包含C#和C++代码

    倍福TwinCAT3上位机与PLC通信测试(ADS通信) 包含C#和C++代码 本次测试需要环境: VS2013,TwinCAT3(本人版本TC31-Full-Setup.3.1.4018.16) 代 ...

  4. 基于S7-PLCSIM Advanced搭建S7通信仿真环境

    写在前面: 之前有专门讲过一期如何搭建西门子PLC的S7通信仿真环境,感兴趣的可以点击查看:戳↓ 1.基于TIA搭建西门子PLC仿真环境及通信方案-联合出品 2.手把手教你搭建西门子PLC仿真环境 那 ...

  5. 用smack+openfire做即时通讯

    首发:个人博客 必须说明:smack最新的4.1.1,相对之前版本变化很大,而且资料缺乏,官方文档也不好,所以还是用老版本3.2.2吧.这篇博文中的代码是4.1.1版的,但不推荐用它.用openfir ...

  6. Android基于XMPP Smack Openfire下学习开发IM(六)总结

    不管学习什么都应该总结 这里我把关于Xmpp的一些方法整理到一个工具类中了 我就分享给大家 XmppConnection.java package com.techrare.utils; import ...

  7. Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等

    http://blog.csdn.net/h7870181/article/details/8653865 以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后 ...

  8. Netty--数据通信和心跳检测

    数据通信 概述: netty的ReadTimeOut实现方案3 服务端: public class Server { public static void main(String[] args) th ...

  9. 五分钟搭建起一个包含CRUD功能的JqGrid表格

    之前的项目也曾用过JgGrid对它的基本功能也是略有了解,网上有个国外的开源的项目,但是不适合个人的风格,所以花了3天空余的时间封装了下JqGrid,也算是参加开发工作10个月以来写的第一个比较完整的 ...

随机推荐

  1. Solr查询空值字段

    摘要: Solr的查询一般都是查找满足某个关键词的文档,偶然一个需求是查询Solr中某个字段不为空的数据.查询空值数据字符串类型 可以通过下面这种查询方式找到所有描述description为空的数据. ...

  2. easyui datagrid 列对不齐

    function initBIRDataGrid(id,cols){ $('#basicTable').datagrid({ //列表区域 pageList: [5, 10, 15], fit:tru ...

  3. HDU - 2037 今年暑假不AC 贪心(求序列中不重叠子序列的最大值问题)

    HDU2037 今年暑假不AC  贪心算法 大意: 每次测试数据输入一个n,然后输入n对的电视节目播放时间:开始时间及结束时间, 求这个人能看的最多的完整的节目数. 解题思路: 对于这道解题,是对每个 ...

  4. LeetCode: 258 Add Digits(easy)

    题目: Given a non-negative integer num, repeatedly add all its digits until the result has only one di ...

  5. html扩展调用qq邮箱

    总体流程:qq邮箱->设置->账户->邮我(使用邮我) over!over!over!

  6. HDU5997 【线段树】

    思路: 用vector存一下各种颜色的区间,每次处理颜色的区间,相同颜色不需要更新.区间最多1e6个没错,但是随着颜色的更替区间只会越来越少. 维护区间左右两端的颜色,lazy一下. 区间合并的时候 ...

  7. 51nod 1449 砝码称重【天平/进制】

    题意: 给你w,n,问你在w^0,w^1,w^2...各种一个,问你能不能用这些砝码和重量为m的东西放在天平上使得天平平衡: 思路: 这个很容易联想到进制: 如果把m放在是一边的话,其实对于砝码就是纯 ...

  8. Cocos2d-x-html5之HelloWorld深入分析与调试

    Cocos2d-x-html5之HelloWorld深入分析与调试 另:本章所用Cocos2d-x版本为: Cocos2d-html5-v2.1.1 http://cn.cocos2d-x.org/d ...

  9. IT兄弟连 JavaWeb教程 Servlet会话跟踪 Session优缺点

    ●  数据存储在服务器,安全. ●  session能保存Object类型数据,也就是说能存储任意数据. ●  可存储的数据大小,理论上是无限制的. ●  因为数据存储在服务器端,当用户比较多时,会占 ...

  10. IT兄弟连 JavaWeb教程 Servlet会话跟踪 设置Session存活时长

    方式一:修改所有的session默认时长,修改tomcat目录下的conf文件夹下的web.xml文件. <session-config> <session-timeout>希 ...