Smack+OpenFire搭建IM通信,包含心跳和自动重连(Android实现)
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实现)的更多相关文章
- Android基于XMPP Smack Openfire下学习开发IM(五)连接断开重连
学习过程中大家都碰到过连接被断开的问题给困扰吧,下面教大家如何做到连接断开后,重新连接 首先要创建连接监听器,用来监听连接状态,这里我写了一个类 继承了ConnectionListener,重写了里面 ...
- Android基于XMPP Smack openfire 开发的聊天室
Android基于XMPP Smack openfire 开发的聊天室(一)[会议服务.聊天室列表.加入] http://blog.csdn.net/lnb333666/article/details ...
- 倍福TwinCAT3上位机与PLC通信测试(ADS通信) 包含C#和C++代码
倍福TwinCAT3上位机与PLC通信测试(ADS通信) 包含C#和C++代码 本次测试需要环境: VS2013,TwinCAT3(本人版本TC31-Full-Setup.3.1.4018.16) 代 ...
- 基于S7-PLCSIM Advanced搭建S7通信仿真环境
写在前面: 之前有专门讲过一期如何搭建西门子PLC的S7通信仿真环境,感兴趣的可以点击查看:戳↓ 1.基于TIA搭建西门子PLC仿真环境及通信方案-联合出品 2.手把手教你搭建西门子PLC仿真环境 那 ...
- 用smack+openfire做即时通讯
首发:个人博客 必须说明:smack最新的4.1.1,相对之前版本变化很大,而且资料缺乏,官方文档也不好,所以还是用老版本3.2.2吧.这篇博文中的代码是4.1.1版的,但不推荐用它.用openfir ...
- Android基于XMPP Smack Openfire下学习开发IM(六)总结
不管学习什么都应该总结 这里我把关于Xmpp的一些方法整理到一个工具类中了 我就分享给大家 XmppConnection.java package com.techrare.utils; import ...
- Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等
http://blog.csdn.net/h7870181/article/details/8653865 以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后 ...
- Netty--数据通信和心跳检测
数据通信 概述: netty的ReadTimeOut实现方案3 服务端: public class Server { public static void main(String[] args) th ...
- 五分钟搭建起一个包含CRUD功能的JqGrid表格
之前的项目也曾用过JgGrid对它的基本功能也是略有了解,网上有个国外的开源的项目,但是不适合个人的风格,所以花了3天空余的时间封装了下JqGrid,也算是参加开发工作10个月以来写的第一个比较完整的 ...
随机推荐
- STL中关于vector的一点有趣的事情
PLZ ADD SOURCE: http://www.cnblogs.com/xdxer/p/4072056.html 今日饭后,一哥发给我一段代码,让我看看会不会有什么问题. #include< ...
- Asset Catalog Help (四)---Adding an iOS App Icon Set or Launch Image Set
Adding an iOS App Icon Set or Launch Image Set Organize different resolutions of your app icons and ...
- 1-2关键字 & 2-1什么是变量
2-1什么是变量 驼峰第一个字母首字母小写后面字母首字母大写 Pascal命名规范:
- Flink on Yarn模式启动流程源代码分析
此文已由作者岳猛授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Flink on yarn的启动流程可以参见前面的文章 Flink on Yarn启动流程,下面主要是从源码角 ...
- TP5之一次选择多张图片并预览
点击选择图片(可选多张),确定后将选择的图片显示在页面上,已经选择的图片也可以删除,点击提交将图片提交给后台. 1.效果图 2.code 用input标签并选择type=file,记得带上multip ...
- Lightoj1081【500棵线段树维护】
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=5e2+10; const ...
- 51nod 1278【贪心】
主要这道题没有包含的情况,所以直接搞个左端,然后对于每个二分求一下>right的最近的位置j,那么ans就会增加 j 以后的: #include <cstdio> #include ...
- 如何实现一个无边框Form的移动和改变大小(二)
接着上文:这里写链接内容 我们来说说一个比较复杂的实现, 效果如图: 注意为了能够凸显没有NC(NotClient)区域,我们额外用了3个panel分别放在窗体的左右和下部.用来模拟客户自己的控件. ...
- (转) Git
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
- Cannot convert value '0000-00-00 00:00:00' TIMESTAMP
MySql Timestamp 类型的字段 '0000-00-00 00:00:00' 转换成Java Timestamp 时会抛出 Cannot convert value '0000-00-00 ...