Smack是一個(gè)用于和XMPP服務(wù)器通信的類(lèi)庫,由此可以實(shí)現即時(shí)通訊和聊天。
Smack主要優(yōu)勢
非常簡(jiǎn)單易用,并且有十分強大的 API。只需三行代碼就可以向用戶(hù)發(fā)關(guān)文本消息:
XMPPConnection connection = new XMPPConnection("jabber.org");
connection.login("mtucker", "password");
connection.createChat("jsmith@jivesoftware.com").sendMessage("Howdy!");
不像其它類(lèi)庫那樣強制您進(jìn)行包級別的編碼。Smack提供智能的更高級的構造,像 Chat和GroupChat類(lèi),讓您進(jìn)行高效的編程。
不需用您熟悉XMPP XML格式,即使您熟悉 XML.
提供簡(jiǎn)單的設計以進(jìn)行通訊,Smack允許您在每個(gè)消息中設置任意數量的屬性,包括java對象。
Apache許可下的開(kāi)源類(lèi)庫,這意味著(zhù)您可以將Smack整合進(jìn)您的商業(yè)或非商業(yè)的應用中。
關(guān)于 XMPP
XMPP (eXtensible Messaging and Presence Protocol)是一個(gè)由Jabber Software Foundation (http://www.jabber.org)領(lǐng)導的開(kāi)放的基于XML的協(xié)議,并且獲得了 IETF的批準。
怎樣使用該文檔
在使用該文檔時(shí)假設您已經(jīng)了解XMPP即時(shí)通訊的主要特征。在您閱讀該文檔的同時(shí)強烈建議您打開(kāi) Javadoc API 幫助文檔作為參考。
這個(gè)文檔將會(huì )向您介紹Smack API,并且簡(jiǎn)要介紹一些重要的類(lèi)和概念。
必要條件
Smack的唯一必要條件是JDK 1.2 或更高版本1。smack.jar文件已包含一個(gè)XML解析器,不需要其它第三方類(lèi)庫。
1 JDK 1.2 and 1.3 用戶(hù)如果想使用SSL連接則classpath在中必須存在JSSE類(lèi)庫。
建立連接
XMPPConnection類(lèi)用來(lái)建立到XMPP服務(wù)器的連接。要建立SSL連接,要使用SSLXMPPConnection類(lèi)。下面是建立連接的例子:
// 建立一個(gè)到j(luò )abber.org服務(wù)器的連接。
XMPPConnection conn1 = new XMPPConnection("jabber.org");
// 通過(guò)一個(gè)特殊的端口建立一個(gè)到j(luò )abber.org服務(wù)器的連接。
XMPPConnection conn2 = new XMPPConnection("jabber.org", 5222);
// 建立一個(gè)到j(luò )abber.org服務(wù)器的SSL連接。
XMPPConnection connection = new SSLXMPPConnection("jabber.org");
一旦您建立了一個(gè)連接,您必須通過(guò)方法XMPPConnection.login(String username, String password)使用用戶(hù)名和密碼登陸。如果登陸成功,您可以通過(guò)創(chuàng )建新的Chat或GroupChat對象和其它用戶(hù)聊天。
操作Roster
Roster能夠讓您跟蹤其它用戶(hù)的有效性(存在)。您可以通過(guò)使用像“朋友”和“同事”這樣的組來(lái)組織用戶(hù),這樣您可以發(fā)現每個(gè)用戶(hù)是否在線(xiàn)。
使用XMPPConnection.getRoster()這個(gè)方法得到Roster。通過(guò)Roster類(lèi)您可以找到所有Roster登陸、他們所屬的組以及每個(gè)登陸當前的存在狀態(tài)。
讀寫(xiě)Packet
從客戶(hù)端以XML格式發(fā)送到XMPP服務(wù)器的每個(gè)消息被稱(chēng)為一個(gè)“packet”。org.jivesoftware.smack.packet包中包含了一些類(lèi),這些類(lèi)封裝了XMPP所允許的三個(gè)不同的基本packet類(lèi)型(message, presence, 和 IQ)。 像Chat和GroupChat這樣的類(lèi)提供了更高類(lèi)別的構造能夠自動(dòng)地創(chuàng )建和發(fā)送packet,但是您也可以直接創(chuàng )建和發(fā)送packet。 下面是一個(gè)通過(guò)改變您的presence來(lái)讓別人知道您已無(wú)效,已經(jīng)"out fishing"了:
// 創(chuàng )建一個(gè)新的presence. 傳入false以指示我們已經(jīng)無(wú)效了
Presence presence = new Presence(Presence.Type.UNAVAILABLE);
presence.setStatus("Gone fishing");
// 發(fā)送packet (假設已經(jīng)有了一個(gè)名為"con"的XMPPConnection實(shí)例).
con.sendPacket(presence);
Smack提供兩種方法讀取收到的packet:PacketListener[packet監聽(tīng)器]和PacketCollector[packet收集器]。 二者都是使用PacketFilter實(shí)例來(lái)決定哪個(gè)packet應該被處理。packet監聽(tīng)器用于事件樣式的編程,而packet收集器有一個(gè)可以做輪詢(xún)和阻塞操作的packet的結果隊列。所以,當您想對一個(gè)有可能隨時(shí)到來(lái)的packet采取一些操作時(shí),使用packet監聽(tīng)器;而當您想等待一個(gè)特別的packet到來(lái)時(shí),使用packet收集器。您可以使用XMPPConnection實(shí)例創(chuàng )建packet收集器和監聽(tīng)器。
聯(lián)系客服