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. debugs

    import os def get_nova_credentials_v2(): d = {} d['version'] = '2.0' d['username'] = os.environ['OS_ ...

  2. python读文件和写文件

    f=open('D:\\wangdongjie\\files\\webservice\\baidu\\3.txt','r+') f.write('中国电视台1][][23qwe12f我是一个小小的石头 ...

  3. SpringMVC笔记- 不配置HandlerMapping

    使用SpringMVC框架时发现有的配置了HandlerMapping,而有的没有,那么它们有什么区别呢?不配置能不能正常使用框架呢? 下面我们看一看不配置任何HandlerMapping时,框架会使 ...

  4. Java中next() 与 nextLine() 区别

    next(): 1.一定要读取到有效字符后才可以结束输入. 2.对输入有效字符之前遇到的空白,next() 方法会自动将其去掉. 3.只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符. 4. ...

  5. DOM学习笔记(二)对象方法与属性

    所有 HTML 元素被定义为对象,而编程接口(对象的访问)则是对象方法和对象属性. 事实上,常用的只用window对象及其子对象document对象,以及事件Event对象. Window 对象 Wi ...

  6. LeetCode: 412 Fizz Buzz(easy)

    题目: Write a program that outputs the string representation of numbers from 1 to n. But for multiples ...

  7. 《剑指offer》面试题17—合并两个排序链表

    题目:输入两个递增排顺序的链表,合并这两个链表并使合并后的链表仍是递增排序的. 重点: 1.代码鲁棒性:要判断输入的两个链表都为NULL:其中一个链表为NULL的情况. 2.用递归实现,注意递归的思路 ...

  8. Spring Boot 学习系列(04)—分而治之,多module打包

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 明确功能,各司其职 在一个结构清晰的项目中,一个没有module划分的结构显然不是最佳实践.有人会说可以在同 ...

  9. css控制页面文字不能被选中user-select:none;

    现象:html中可能有些地方不想让用户复制文字,或是用a标签做了个点击按钮,点快的时候文字会被选中,很丑,这个时候可以使用下面的方案禁止文字选中. 原因:鼠标点快了文字会被选中. 解决方案:不同的浏览 ...

  10. HDU4248【DP】

    题意: 有n种石头,每种石头有a[i]个,然后让你去组合,问有多少种组合: 思路: 这种题,排列组合知识一上,非常麻烦,已经搞了好几题,看似就是排列组合的姿势,然而最终都是一种递推,也就是DP,而且比 ...