天天看點

XMPP用戶端庫Smack 4.0.6版開發

XMPP用戶端庫Smack 4.0.6版開發

一、Smack庫概述

Smack是一個開源、易用的XMPP/Jabber用戶端庫,它使用Java語言開發,由Jive Software開發。

Smack的優點是程式設計簡單。

Smack的缺點是其API并非為大量并發使用者設計,每個客戶都要1個線程,占用資源相對較,是以用Smack做模拟測試時,1台機器隻能模拟有限(數千個)客戶。

截止2014年11月27日,Smack庫已經發展到4.0.6版。

最新的好消息是Smack在4.1.0版後将直接支援Android系統,而無需再使用以前的Smack移植版aSmack庫了。

Smack庫源碼托管于GitHub,首頁見: https://github.com/igniterealtime/Smack/

二、Smack 4的改變

Smack庫從3.4版發展到4.0.x版後,其API有較大的變化,主要有:

1、把Connection類重命名為XMPPConnection類

XMPPConnection類是XMPPTCPConnection類和XMPPBOSHConnection類的父類。

2、把各種Provider類進行了分包

3、keep-alive(持久連接配接)機制從smack-core庫移到了smack-extensions庫

keep-alive機制現在由PingManager類提供。

4、PrivacyList類的toString()方法重命名為getName()

5、當Chat執行個體的所有引用都撤掉後,應該調用Chat.close()方法

否則Chat對象會有記憶體洩露的隐患,直到ChatManager對象被垃圾回收器回收後記憶體洩露隐患才會消失。

6、ServerTrustManager類被移除了

如果要使用帶SSL認證的XMPP,你隻需提供自己的SSLContext對象給ConnectionConfiguration對象即可。

7、Packet.setProperty()從smack-core庫移到了smack-extensions庫

其API現在可以在org.jivesoftware.smackx.jiveproperties包中找到。

8、Connection.getAccountManager()方法現在改成了AccountManager.getInstance(XMPPConnection)方法

9、異常API做了改進

10、ToContains過濾器被移除了

三、Smack庫的特征

1、極度簡單易用,API功能強大

發送一條文本消息給某個使用者隻需幾行代碼:

點選(此處)折疊或打開

AbstractXMPPConnection connection = new XMPPTCPConnection("mtucker", "password", "jabber.org");

connection.connect();

connection.login();

Chat chat = ChatManager.getInstanceFor(connection)

.createChat("[email protected]", new MessageListener(){

public void processMessage(Chat chat, Message message){

System.out.println("Received message: " + message);

}

});

chat.sendMessage("Howdy!");

2、隔離了底層資料包組裝的複雜性,自然有相應的庫來完成這些功能。Smack提供了更智能的高層構造,比如Chat類和Roster類,這樣開發會更富有效率。

1)無需熟悉XMPP的XML格式,甚至都不需要了解XML

2)提供了簡單的M2M通信

Smack讓開發者可以對每條消息都設定大量的屬性,屬性中還可以包含Java對象。

3)基于Apache許可證的開源代碼,這意味着你可以把Smack放入你自己的商業軟體中。

四、Smack庫的組成

Smack庫可以内嵌到任意的Java應用程式中。Smack庫有數個JAR檔案組成,非常具有靈活性。

1、smack-core.jar

提供了核心XMPP功能。都是XMPP RFC規範定義的XMPP特性。

2、smack-extensions.jar

支援許多由XMPP Standards Foundation定義的擴充(XEP)功能。包括群聊、檔案傳輸、使用者搜尋等等。

以後可檢視文檔《擴充手冊》:

https://github.com/igniterealtime/Smack/blob/master/documentation/extensions/index.html

(目前還是無效的)

3、smack-experimental.jar

支援許多由XMPP Standards Foundation定義的體驗性(XEP)功能。其API和功能特性都被認為是不穩定的。

4、smack-legacy.jar

支援許多由XMPP Standards Foundation定義的遺留(XEP)功能。

5、smack-bosh.jar

支援BOSH通信(XEP-0124規範定義的)。此代碼被認為處于Beta階段。

6、smack-jingle.jar

支援Jingle。此代碼很老,目前處于無維護的狀态。

7、smack-resolver-dnsjava.jar

支援對DNS SRV記錄的解析,主要用于那些不支援javax.naming API的平台。

8、smack-debug.jar

用于協定流量的增強型GUI調試器。當調試模式開啟後,如果它在類路徑下,它會自動被使用。

以後可檢視文檔《調試模式》:

https://github.com/igniterealtime/Smack/blob/master/documentation/debugging.html

五、Smack的配置

Smack的初始化過程涉及到2階段的調用。

1、初始化系統屬性

通過SmackConfiguration類初始化所有的系統可通路屬性,這些屬性都是通過getXXX方法取回屬性值的。

2、初始化啟動類

任意類如果繼承了SmackInitializer接口後,都可以在調用initialize()方法後得到初始化,這意味着得到初始化的類在啟動後都是活動的。

如果沒有繼承SmackInitializer接口,那麼要實作初始化,必須要放置一個靜态代碼塊來實作——他在類裝載時會自動執行。

初始化是通過配置檔案來完成的。預設情況下,Smack會載入Smack JAR檔案中内嵌的配置檔案(它位于org.jivesoftware.smack/smack-config.xml)。這個指定的配置檔案包含了一系列需載入初始化的類清單。所有的管理器類型的類都需要被初始化,這些管理器類就包含在上面所說的初始化清單中。