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个月以来写的第一个比较完整的 ...
随机推荐
- bzoj 4260 Codechef REBXOR——trie树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4260 一段的异或和就是两个前缀的异或和.正反扫两边,用trie树算每个位置为左/右端点时最大 ...
- JNI——JAVA调用C
1. 编译java:javac JNIDemo.java 2. 编译JNI:gcc -I/usr/lib/jvm/java-1.8.0-openjdk-amd64/include/ -I/usr/li ...
- mysql函数之九:MySql取得日期(前一天、某一天)
取得当天: SELECT curdate(); mysql> SELECT curdate();+------------+| curdate() |+------------+| 2013- ...
- 64位windows7下安装python,配置numpy和matplotlib库
一.Python的安装 1.下载python2.7,下载地址:http://www.python.org/,选择系统相应版本,我选择是的是python2.7.6 . python-2.7.6rc1.a ...
- 使用jdk获取网页
参考:https://www.zhihu.com/question/30626103 由于例子比较老了,现在的百度抓不到完整的页面了 import java.io.BufferedReader; im ...
- Flutter实战视频-移动电商-53.购物车_商品列表UI框架布局
53.购物车_商品列表UI框架布局 cart_page.dart 清空原来写的持久化的代码; 添加对应的引用,stless生成一个静态的类.建议始终静态的类,防止重复渲染 纠正个错误,上图的CartP ...
- Swift 数组,字典,结构体,枚举
1.数组 let types = ["none","warning","error"]//省略类型的数组声明 var menbers = [ ...
- test markdown style
code // Forward declaration of isBadVersion API. bool isBadVersion(int version); class Solution { pu ...
- ZOJ3166【找环值最小】
题意: 给你一幅图,要你找一个hotel能够满足出去回来,而且保证权值最小: 思路: 可以搜环,然后取最小权值环,拿个点: floyd方便,初始话自己到自己就是无穷,然后就枚举一下给出的hotel就好 ...
- 最长XX序列问题小结 By cellur925
今天我们搞一搞几个经典序列问题之间的爱♂恨♂情♂仇. 首先我们看一看LIS(最长上升子序列)(From my onenote)