Smack+Openfire搭建IM通信(Android 实现)

来源:互联网 发布:淘宝天猫黑名单处理 编辑:程序博客网 时间:2024/05/16 11:10

Smack是一个开源,易于使用的XMPP(jabber)客户端类库。优点:开源,简单,功能强大,给用户发送信息只需三行代码便可完成。缺点:API并非为大量并发用户设计,每个客户要1个线程,占用资源大,1台机器只能模拟有限(数千个)客户.。

OpenFire是开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器。 Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。

1、首先去 http://www.igniterealtime.org 下载OpenFire和Smack


2、安装Openfire进入控制台

此处是服务器关于空闲连接的设置


建两个测试账号


用电脑端的Spark登录一个账号


3、手机端登录,代码和程序在后面


实现端到端通信



4、Smack通信模块示意图


5、Smack端实现关键代码(Android),包含心跳+自动重连机制

//配置连接,连接成功注册PingListener和MessageReceiver,发送登陆成功广播,这里因为业务需要我设置为10秒ping一次

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 secondsMyPingManager myPingManager = MyPingManager.getInstanceFor(mConnection);//Set PingListener here to catch connect statusmyPingManager.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);} }
//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

0 0
原创粉丝点击