XMPP 通訊之Asmack(一) 創建鏈接

  先聲明:我這裏不分析源碼,只介紹開發包的使用,歡迎你們交流java

  openfire+spark+smack是java領域的一種即時通訊解決方案;android

  Openfire是基於Jabber協議(XMPP)實現的即時通訊服務器端版本,網上很容易找到開發包,建議使用能找到的最新開發包;編程

  Spark支持聊天、語音、視頻、截屏、會議、文件收發、鏈接MSN等功能,我未找到android方面的支持,各位博友如有謝謝分享;服務器

  Smack是即時通訊客戶端編程庫,是基於XMPP的java實現,提供了一套可擴展的API,而Asmack是該編程庫的android版本,這是本文介紹的重點;微信

  1.什麼是XMPP?ide

  百度百科上解釋的是「XMPP是一種基於標準通用標記語言的子集XML的協議」,簡單的說就是一個收發消息的協議,而這個協議就是基於XML;XMPP的前身是jabber,由一個開源組織產生的即時通訊協議,後來由IETF完成標準化工做;測試

  2.IMui

  即」即時通訊軟件「,想如今國內使用人比較多的QQ、微信等等,但他們採用的是這些公司本身的通訊協議,並不對外開放,通常的公司沒有過於硬性的需求,XMPP協議已經能夠知足咱們的需求;this

 接下來就是正文,即Asmack的使用:spa

 1.關於開發包,就儘可能使用能找到的最新的開發包,若是須要請在評論區留下郵箱

 2.下面就逐步講解相關使用:

 1、鏈接,這部分重點是一個類,一個監聽接口

  1.ConnectionConfiguration類,這個類是用來配置鏈接參數的類

  

     try {
            //初始化時傳入服務器地址和端口號
            connConfig = new ConnectionConfiguration(ChatRoomInfo.openfireAddress, ChatRoomInfo.openfirePort);
            // 設置登陸狀態爲離線
            connConfig.setSendPresence(false);
            connConfig.setSecurityMode(ConnectionConfiguration.SecurityMode.required);
            //容許從新鏈接
            connConfig.setReconnectionAllowed(true);
            //服務器名稱,這個須要跟後臺約定好
            connConfig.setServiceName(ChatRoomInfo.serverName);
            con = new XMPPConnection(connConfig);
//紅色標記的部分請留意,後面會詳細講解 con.addPacketListener(
new ChatPacketListener(null), new ChatPacketFilter(context));
            connectionListener = new ViConnectionListener(context,mHandler, successful); con.addConnectionListener(connectionListener);

//開始鏈接 con.connect();
if (con.isConnected()) { LogUtil.w("conn is conn");//con.addPacketListener(new ChatPacketListener(null),new PacketTypeFilter(Message.class)); } LogUtil.i("XmppTool......連後接22222222222"); } catch (Exception e) { }

  2.ConnectionListener 這個接口監聽鏈接狀態,上面ViConnectionListener類則是個人實現該接口,這個接口的做用在於監聽XMPP的鏈接情況,若是鏈接失敗的狀況出現,自動進行重連,及其餘狀況的處理,本身的代碼以下;

package com.bankeys.general.chatroom.Utils;

import android.content.Context;

import com.bankeys.general.chatroom.Handler.GeneralChatRoomHandler;
import com.bankeys.general.chatroom.Interface.CharRoomCore;
import com.bankeys.general.chatroom.Log.LogUtil;

import org.jivesoftware.smack.ConnectionListener;
import org.jivesoftware.smack.packet.Presence;

/**
 * 同帳號登陸等狀況監聽
 */
public class ViConnectionListener implements ConnectionListener {
    private GeneralChatRoomHandler mHandler;
    private CharRoomCore connectSuccessful;
    private Context context;

    /**
     *
     * @param context
     * @param mHandler  GeneralChatRoomHandler這個是handler的子類,用來處理這裏的各類狀況,能夠視狀況而定
     * @param connectSuccessful  這個接口如今看顯得有些多餘,畢竟有handler來處理了 就不須要了,不過暫時先放在這裏不影響
     */
    public ViConnectionListener(Context context,GeneralChatRoomHandler mHandler, CharRoomCore connectSuccessful) {
        this.mHandler = mHandler;
        this.connectSuccessful = connectSuccessful;
        this.context = context;
    }

    @Override
    public void connectionClosed() {
        //鏈接關閉
        LogUtil.i("---------connectionClosed---------");
    }

    @Override
    public void connectionClosedOnError(Exception e) {
        //鏈接錯誤關閉,錯誤鏈接的狀況,參考下就行,這部分目前還沒測試
        LogUtil.i("ViConnectionListener-->connectionClosedOnError");
        if (e.getMessage().contains("conflict")) { //
            LogUtil.i("ViConnectionListener-->同一帳號登錄");
            if (mHandler != null)
                mHandler.obtainMessage(4).sendToTarget();
            //關閉鏈接,因爲是被人擠下線,多是用戶本身,因此關閉鏈接,讓用戶從新登陸是一個比較好的選擇
            XmppTool.getInstance().closeConnection();
            // 接下來你能夠經過發送一個廣播,提示用戶被擠下線,提示用戶從新登陸
        } else if (e.getMessage().contains("Connection timed out")) {// 鏈接超時
            LogUtil.i("ViConnectionListener 正在重連......ʱ");

        } else if (e.getMessage().contains("system-shutdown")) {     // 服務器關閉
            LogUtil.w("服務器關閉");
            if (mHandler != null)
                mHandler.obtainMessage(5).sendToTarget();
        }
        LogUtil.i(e.getMessage());
    }

    @Override
    public void reconnectingIn(int arg0) {
        LogUtil.i("ViConnectionListener-->reconnectingIn 正在從新鏈接......");
    }

    @Override
    public void reconnectionFailed(Exception arg0) {
        LogUtil.i("ViConnectionListener-->reconnectionFailed  從新鏈接失敗......");
    }

    @Override
    public void reconnectionSuccessful() {
        LogUtil.i("鏈接成功/登錄成功......");
        // 設置登陸狀態:在線
        Presence presence = new Presence(Presence.Type.available);
        XmppTool.getInstance().getConnection(context,mHandler, connectSuccessful).sendPacket(presence);
        if (connectSuccessful != null) {
            connectSuccessful.onConnectSuccessful();
        }
    }


}

  這裏要添加一點說明,在咱們創建鏈接或者創建鏈接以前記得加上下面的代碼:

    // 靜態加載ReconnectionManager ,重連後正常工做
    static {
        try {
            Class.forName("org.jivesoftware.smack.ReconnectionManager");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
相關文章
相關標籤/搜索