先聲明:我這裏不分析源碼,只介紹開發包的使用,歡迎你們交流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(); } }