smack使用指南(譯)(二)Smack入門

本文將向您介紹Smack API,并提供重要的類和概念的概述。

JAR文件和相關(guān)要求(注意點)

Smack可以輕松地嵌入到任何現(xiàn)有的Java應(yīng)用程序中。 庫被分作幾個JAR文件,以便更靈活的按需求給應(yīng)用程序提供相關(guān)功能:

smack-core.jar

  • 提供核心XMPP功能。 包括作為XMPP RFC的一部分的所有XMPP功能。
    smack-im.jar
  • 提供RFC 6121(XMPP-IM)中定義的功能,如花名冊。
    smack-tcp.jar
  • 通過TCP支持XMPP。 包括XMPPTCPConnection類,一個常用的類。
    smack-extensions.jar
  • 支持由XMPP標(biāo)準(zhǔn)基金會定義的許多擴(kuò)展(XEP),包括多用戶聊天,文件傳輸,用戶搜索等。
    smack-experimental.jar
  • 支持由XMPP標(biāo)準(zhǔn)基金會定義的實驗擴(kuò)展(XEP)。 這些擴(kuò)展的API和功能通常被認(rèn)為是不穩(wěn)定的。
    smack-legacy.jar
  • 支持由XMPP標(biāo)準(zhǔn)基金會定義的舊擴(kuò)展(XEP)。
    smack-bosh.jar
  • 支持BOSH(XEP-0124)。 該代碼應(yīng)該被視為beta。
    smack-jingle.jar
  • 支持Jingle。 這段代碼是舊的,現(xiàn)已不再維護(hù)。
    smack-resolver-dnsjava.jar
  • 支持在dnsjava的幫助下解析DNS SRV記錄。 適用于不支持javax.naming API的平臺。
    smack-resolver-javax.jar
  • 支持使用javax命名空間API解析DNS SRV記錄。
    smack-debug.jar
  • 用于協(xié)議流量的增強(qiáng)型GUI調(diào)試器。 當(dāng)在類路徑中找到并且啟用調(diào)試時,它將自動使用。

配置

Smack有一個包含兩個階段的初始化過程。

  • 初始化系統(tǒng)屬性 - 初始化通過類SmackConfiguration可訪問的所有系統(tǒng)屬性。 這些屬性由該類的getXXX方法獲取。
  • 初始化啟動類 - 通過實例化過程初始化任何在啟動時處于活動狀態(tài)的類,如果擴(kuò)展了SmackInitializer ,則調(diào)用該類的initialize方法。 如果它不擴(kuò)展這個接口,那么初始化將必須在一個靜態(tài)的代碼塊中進(jìn)行,這個代碼在加載類時自動執(zhí)行。

初始化通過配置文件完成。 默認(rèn)情況下,Smack將加載嵌入在Smack.jar中的org.jivesoftware.smack / smack- config.xml。 此特定配置包含將要被加載的初始化程序類(initializer 初始化者)的列表。 所有需要初始化的管理員(manager )類型類都是初始化程序類(initializer 初始化者)。

建立連接

XMPPTCPConnection類用于創(chuàng)建與XMPP服務(wù)器的連接。 以下是進(jìn)行連接的代碼示例:

// Create a connection to the jabber.org server.
AbstractXMPPConnection conn1 = new XMPPTCPConnection("username", "password" "jabber.org");
conn1.connect();

// Create a connection to the jabber.org server on a specific port.
XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
  .setUsernameAndPassword("username", "password")
  .setXmppDomain("jabber.org")
  .setHost("earl.jabber.org")
  .setPort("8222")
  .build();

AbstractXMPPConnection conn2 = new XMPPTCPConnection(config);
conn2.connect();

請注意,默認(rèn)情況下,連接到服務(wù)器時將使用最大的安全性(當(dāng)可能的時候),包括使用TLS加密。 ConnectionConfiguration類提供對創(chuàng)建的連接的高級控制,例如禁用或開啟加密的功能。 有關(guān)詳細(xì)信息,請參閱XMPPConnection Management 。

創(chuàng)建連接后,您應(yīng)該使用XMPPConnection.login()方法登錄。 登錄后,您可以通過創(chuàng)建新的Chat或MultiUserChat對象與其他用戶進(jìn)行聊天。

與花名冊配合工作

花名冊可讓您跟蹤其他用戶的可用性(在線狀態(tài))。 用戶可以組織成“朋友”和“同事”組,知曉每個用戶是在線還是離線。

使用Roster.getInstanceFor(XMPPConnection)方法獲取花名冊。 花名冊類允許您查找所有的花名冊條目,它們所屬的組以及每個條目的當(dāng)前狀態(tài)。

從客戶端向XMPP服務(wù)器發(fā)送的每條消息稱為一個數(shù)據(jù)包(packet),并以XML格式發(fā)送。 org.jivesoftware.smack.packet包包含封裝XMPP允許的三種(message, presence, and IQ)不同基本數(shù)據(jù)包類型的類。 諸如Chat和GroupChat提供了管理自動創(chuàng)建和發(fā)送數(shù)據(jù)包的更高級別的結(jié)構(gòu)(高級方法),但是您也可以直接創(chuàng)建和發(fā)送數(shù)據(jù)包。 以下是一個代碼示例,用于更改您的在線狀態(tài),讓人們知道您“外出釣魚”:

// Create a new presence. Pass in false to indicate we're unavailable._
Presence presence = new Presence(Presence.Type.unavailable);
presence.setStatus("Gone fishing");
// Send the stanza (assume we have an XMPPConnection instance called "con").
con.sendStanza(presence);

Smack提供了兩種讀取傳入數(shù)據(jù)包的方式: StanzaListener和StanzaCollector
。 兩者都使用StanzaFilter實例來確定應(yīng)該處理哪個XML Stanza(XML節(jié))。 StanzaListener用于事件風(fēng)格編程,而節(jié)StanzaCollector具有一個可以進(jìn)行輪詢和阻止操作的數(shù)據(jù)包結(jié)果隊列。 所以,當(dāng)一個節(jié)出現(xiàn)時,當(dāng)你想采取一些動作時,一個StanzaListener會很有用,而當(dāng)你想要等待一個特定的數(shù)據(jù)包到達(dá)時,一個StanzaCollector會很有用。 可以使用Connection實例創(chuàng)建StanzaListener和StanzaCollector。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容