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. 从MySQL获取数据

    安装 PM> install-package newtonsoft.json PM> install-package mysql.data string connectionString ...

  2. ComboBox的真实值和显示值

    一.类型 /// <summary> /// 下拉框值类型 /// </summary> public class TextAndValue { /// <summary ...

  3. js格式

    /** * Created by admin on 2017/9/22. */ // 分号后不要再有多余的空格 var name = "North"; var name = &qu ...

  4. vs2012安装程序,无法注册ActiveX

    最近开发环境换成了vs2012,用C#写了一个ActiveX插件程序,然后添加一个安装程序,但是安装后,ie无法识别AcitveX,在ie的Manage add-ons中也找不到,这在vs2010是没 ...

  5. Redis的小白应用

    在window下测试学习redis 步骤: 1.先下载安装 redis,(conf文件制定配置文件(redis-server.exe  redis.conf ),若不指定则默认), 基本上我是直接点击 ...

  6. PHP错题误区

    1,$bool = TRUE;echo gettype($bool);  //这个输出类型:booleanecho is_string($bool);  //这个用echo是不能输出布尔型的,只有va ...

  7. CodeForces 349B Color the Fence (DP)

    题意:给出1~9数字对应的费用以及一定的费用,让你输出所选的数字所能组合出的最大的数值. 析:DP,和01背包差不多的,dp[i] 表示费用最大为 i 时,最多多少位,然后再用两个数组,一个记录路径, ...

  8. 大将军UE分析

    1.过关奖励,先播放特效,在显示奖励 2.鼠标移到人物身上装备,提示双击卸载 3.战场随机事件,出发开启增加buff 4.主线任务简单化,副本支线可玩性增强 5.乌泱泱几十个活动 6.升级的爽快感[升 ...

  9. fitnesse(gradle构建)安装步骤

    1.安装jdk.ant.gradle(参考http://www.cnblogs.com/274914765qq/p/4401525.html) 2.下载Fitnesse https://github. ...

  10. [WIP]webpack 概念

    创建: 2019/04/09 概念    入口 指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始. 进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖 ...