實(shí)戰(zhàn)項(xiàng)目xmpp版即時(shí)聊天第01天smack類(lèi)庫(kù)詳細(xì)介紹_第1頁(yè)
實(shí)戰(zhàn)項(xiàng)目xmpp版即時(shí)聊天第01天smack類(lèi)庫(kù)詳細(xì)介紹_第2頁(yè)
實(shí)戰(zhàn)項(xiàng)目xmpp版即時(shí)聊天第01天smack類(lèi)庫(kù)詳細(xì)介紹_第3頁(yè)
實(shí)戰(zhàn)項(xiàng)目xmpp版即時(shí)聊天第01天smack類(lèi)庫(kù)詳細(xì)介紹_第4頁(yè)
實(shí)戰(zhàn)項(xiàng)目xmpp版即時(shí)聊天第01天smack類(lèi)庫(kù)詳細(xì)介紹_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Smack 類(lèi)庫(kù)詳細(xì)介紹Smack 是一個(gè)為使用 XMPP 服務(wù)器聊天和發(fā)送即時(shí)消息交流而提供的庫(kù)。 Smack 的主要優(yōu)勢(shì):使用簡(jiǎn)單且擁有強(qiáng)大的 API。向用戶(hù)發(fā)送一條文本消息只需用一下三行代碼即可完成 XMPPConnection connection = new XMPPConnection(); connection.login(mtucker, password);connection.createChat(jsmit).sendMessage(Howdy!);不像其它庫(kù)那樣,強(qiáng)制你在信息報(bào)級(jí)(packet level)編碼。Smack 提供智能的、更高級(jí)別的結(jié)構(gòu),例如:Chat 和

2、GroupChat 類(lèi),這寫(xiě)能讓你的程序效率更高。你不需要熟悉 XMPP XML 格式,甚至不熟 XML。提供簡(jiǎn)單的機(jī)器到機(jī)器的通訊。Smack 允許你對(duì)每一條消息設(shè)置任何數(shù)字的屬性,包括 Java 對(duì)象的屬性。 Apache 許可的開(kāi)放源碼,你可將其用于商業(yè)的和非商業(yè)的應(yīng)用。關(guān)于 XMPPXMPP (eXtensible Messaging and Presence Protocol)是一個(gè)開(kāi)放的,如何使用本文檔本文檔假定你已經(jīng)熟悉 XMPP 即時(shí)消息的主要特征。我們推薦你在閱讀該文檔時(shí)打開(kāi) Javadoc API 作為參考。開(kāi)始 Smack本文檔將向你介紹 Smack API,并大概介紹幾

3、個(gè)重要的類(lèi)和概念。必備的條件你只需要有 JDK 1.2 或之后的版本 1 和已經(jīng)內(nèi)嵌在 smack.jar 文件中的 XML 分析器,不需要第三部分庫(kù)。1JDK 1.2 and 1.3 的用戶(hù)若想使用 SSL 連接必須在他的類(lèi)路徑下有 JSSE 庫(kù)。建立一個(gè)連接X(jué)MPPConnection 類(lèi)是為 XMPP 服務(wù)器建立連接的類(lèi)。若要?jiǎng)?chuàng)建 SSL 連接,需使用 SSLXMPPConnection 類(lèi),以下是創(chuàng)建連接的例子。/ Create a connection to the server. XMPPConnection conn1 = new XMPPConnection();/ Creat

4、e a connection to the server on a specific port. XMPPConnection conn2 = new XMPPConnection(, 5222);/ Create an SSL connection to .XMPPConnection connection = new SSLXMPPConnection();如果創(chuàng)建了一個(gè)連接,你應(yīng)該使用 XMPPConnection.login(String username, String password)方法(參數(shù)為用戶(hù)名和密碼)進(jìn)行登陸。一旦登陸成功,你就可以通過(guò)創(chuàng)建一個(gè)新的 Chat 或Grou

5、pChat 對(duì)象與其它用戶(hù)聊天。使用花名冊(cè)(Working with the Roster)花名冊(cè)讓你很清楚的知道其它可用的用戶(hù)。用戶(hù)可以被分成像“朋友”、“合作者”這樣的組,從而知道其它的用戶(hù)在線(xiàn)還是離線(xiàn)。可以使用 XMPPConnection.getRoster()方法檢索花名冊(cè)。你可以用花名冊(cè)(roster)類(lèi)查找花名冊(cè)的所有條目,它們所屬的組以及每個(gè)條目當(dāng)前呈現(xiàn)的狀態(tài)。讀、寫(xiě)信息包(Reading and Writing Packets)從客戶(hù)端發(fā)送到 XMPP 的每一條消息稱(chēng)為一個(gè)信息包,并作為 XML 發(fā)送。The org.jivesoftware.smack.packet 包含封

6、裝了三個(gè) XMPP 允許的、不同的基本包類(lèi)型(message, presence, and IQ)的類(lèi)。像 Chat 和GroupChat 這樣的類(lèi)提供更高級(jí)別的結(jié)構(gòu),它可以自動(dòng)的創(chuàng)建和發(fā)送信息包,當(dāng)然你也可以直接創(chuàng)建和發(fā)送信息包。以下代碼是一個(gè)將你的當(dāng)前狀態(tài)改為“隱身“,從而不被別人看到的例子:/ Create a new presence. Pass in false to indicate were unavailable. Presence presence = new Presence(Presence.Type.UNAVAILABLE); presence.setStatus(Go

7、ne fishing);/ Send the packet (assume we have a XMPPConnection instance called con). con.sendPacket(presence);Smack 提供以下兩種方法閱讀收到的信息包:PacketListener 和PacketCollector。它們都使用PacketFilter 的實(shí)例來(lái)決定應(yīng)該處理哪個(gè)信息包。信息包監(jiān)聽(tīng)器(packet listener)用于事件類(lèi)型的設(shè)計(jì),而信息包收集器(packet collector)有一個(gè)信息包的結(jié)果隊(duì)列,你可以對(duì)其實(shí)施 polling 和 blocking 操作。所

8、以,信息包監(jiān)聽(tīng)器在你收到任何一個(gè)信息包,且你想對(duì)其進(jìn)行操作時(shí)是有用的,而信息包收集器在你想等待某個(gè)特殊的信息包時(shí)是有用的。信息包收集器和監(jiān)聽(tīng)器可以通過(guò) XMPPConnection 的實(shí)例來(lái)創(chuàng)建。Messaging BasicsMessaging using Chat and GroupChat互相發(fā)送消息是即時(shí)通訊的核心,以下是兩個(gè)在收發(fā)消息是用的類(lèi): org.jivesoftware.smack.Chat 用于兩個(gè)人之間發(fā)送消息 org.jivesoftware.smack.GroupChat 用于加入聊天室,很多人之間相互發(fā)送消息。Chat 和GroupChat 類(lèi)都用org.jives

9、oftware.smack.packet .Message 信息包類(lèi)發(fā)送消息。在某些情況下,也許你希望繞過(guò)更高級(jí)別的 Chat 和GroupChat 類(lèi)直接發(fā)送和接受消息。聊天(Chat)聊天時(shí)在兩個(gè)用戶(hù)間創(chuàng)建了一個(gè)新的線(xiàn)程(使用一個(gè)線(xiàn)程 ID)。以下程序片示例了如何如何與一個(gè)用戶(hù)進(jìn)行開(kāi)始聊天并發(fā)送一段文本消息:/ Assume weve created an XMPPConnection name connection.Chat newChat = connection.createChat(jsmitnewChat.sendMessage(Howdy!););Chat.sendMessag

10、e(String)方法可以很方便的創(chuàng)建一個(gè)消息對(duì)象,方法體使用字符串類(lèi)型的參數(shù),然后發(fā)送消息。如果想在發(fā)送消息前對(duì)消息設(shè)置額外的只,可以使用 Chat.createMessage() and Chat.send Message(Message)方法,如下例所示: / Assume weve created an XMPPConnection name co nnection.Chat newChat = connection.createChat(jsmit Message newMessage = newChat.createMessage(); newMessage.setBody(How

11、dy!); message.setProperty(favoriteColor, red); newChat.sendMessage(newMessage););使用 Chat 對(duì)象可以輕松的收聽(tīng)其它聊天者的回復(fù)。以下程序片是 parrot-bot,它映射會(huì)其它用戶(hù)類(lèi)型的所有事情: / As sume weve created an XMPPConnection name connection.Chat newChat = connection.createChat(jsmit);newMessage.setBody(Hi, Im an annoying parrot-bot! Type so

12、mething back to me.); while (true) / Wait for the next message the user types to us. Message message = newChat.nextMessage();/ Send back the same text the other user sent us. newChat.sendMessage(message.getBody();以上代碼使用 Chat.nextMessage()方法獲得下一條消息,它必需一直等待直到收到下一條消息。也有其它的方法可以等待特定的時(shí)間來(lái)接受下一條消息,或者你也可以增加一個(gè)

13、監(jiān)聽(tīng)器,它可以在每次收到消息時(shí)通知你。群聊(GroupChat)群聊在通過(guò)一個(gè)服務(wù)器連接到聊天室,你可以向一組人發(fā)送消息或接收他們的消息。在你能接收和發(fā)送消息前,你必須使用一個(gè)昵稱(chēng)登陸到聊天室。以下程序段可以連接到一個(gè)聊天室并發(fā)送消息:/ Assume weve created an XMPPConnection name connection.GroupChat newGroupChat = connection.createGroupChat(tes/ Join the group chat using the nickname jsmith. newGroupChat.join(jsmi

14、th);/ Send a message to all the other people in the chat room. newGroupChat.sendMessage(Howdy!););,群聊時(shí)收發(fā)消息和私聊時(shí)工作原理大體一致。同樣,也有方法可以獲得聊天室里其它用戶(hù)的列表。 Roster and Presence花名冊(cè)讓你很清楚的知道其它可用的用戶(hù)。用戶(hù)可以被分成像“朋友”、“合作者”這樣的組。其它的即使通訊系統(tǒng)將花名冊(cè)作為好友列表、聯(lián)系列表等。當(dāng)你成功登陸服務(wù)器后,可以使用 XMPPConnection.getRoster()獲得 Roster 類(lèi)的實(shí)例。花名冊(cè)條目(Roster

15、Entries)花名冊(cè)里的每一個(gè)用戶(hù)都以一條花名冊(cè)條目的形式呈現(xiàn),包括以下幾部分:一個(gè) XMPP 地址(例如:).分配給你的用戶(hù)名 (例如: Joe).該條目在花名冊(cè)中所屬組的列表。如果該條目不屬于任何一個(gè)組,將被稱(chēng)為“尚未分類(lèi)的條目。以下程序段可以打印出花名冊(cè)中的所有條目:Roster roster = con.getRoster();for (Iterator i=roster.getEntries(); i.hasNext(); ) System.out.println(i.next();也有獲得個(gè)人條目、尚未分類(lèi)條目的列表、一個(gè)或者所有組的方法。呈現(xiàn)(Presence)花名冊(cè)中的每一個(gè)

16、條目都有相關(guān)的呈現(xiàn)方式。Roster.getPresence(String user)方法將通過(guò)用戶(hù)的狀態(tài)或當(dāng)用戶(hù)不在線(xiàn)或不同意將其在線(xiàn)狀態(tài)顯示出來(lái)時(shí)使用空對(duì)象(null)返回一個(gè) Presence 對(duì)象。注意:一般情況下,用戶(hù)是否同意顯示其狀態(tài)依賴(lài)于用戶(hù)所在的花名冊(cè),但這不是在所有情況下都成立的。用戶(hù)也有一個(gè)在線(xiàn)或離線(xiàn)的狀態(tài),如果用戶(hù)在線(xiàn),他們的顯示信息中將會(huì)有一些擴(kuò)展的信息,例如他當(dāng)前正在做什么,是否希望被打擾等等,詳細(xì)內(nèi)容可以參看 Presence 類(lèi)。Listening for Roster and Presence ChangesRoster 類(lèi)的典型用途是用樹(shù)狀形式顯示組和每一個(gè)條

17、目以及它的當(dāng)前狀態(tài)。如下圖所示是 Exodus XMPP 客戶(hù)端的花名冊(cè)。顯示的信息很可能會(huì)經(jīng)常改變,也有可能是花名冊(cè)的條目被改變甚至被刪除。為了監(jiān)視花名冊(cè)的改變和顯示的信息,應(yīng)該使用一個(gè)花名冊(cè)監(jiān)聽(tīng)器(RosterListener)。以下代碼使用 Roster(它可以打印出花名冊(cè)中的任何變化)注冊(cè)了一個(gè) RosterListener。標(biāo)準(zhǔn)的客戶(hù)端應(yīng)該使用相似的代碼更新花名冊(cè)的用戶(hù)信息(roster UI)以正確顯示變化的信息。final Roster roster = con.getRoster(); roster.addRosterListener(new RosterListener()

18、public void rosterModified() / Ignore event for this example.public void presenceChanged(String user) / If the presence is unavailable then null will be printed,/ which is fine for this example.System.out.println(Presence changed: + roster.getPresence(user););向花名冊(cè)中添加條目(Adding Entries to the Roster)花

19、名冊(cè)和顯示使用基于許可的模型,這要求用戶(hù)在加入別人的花名冊(cè)前必須得到允許。這樣,確保只有被允許的人才可以看到自己所顯示的信息,從而保護(hù)了用戶(hù)的隱私。因此,在你想添加一個(gè)新的條目,且對(duì)方?jīng)]有接受你的請(qǐng)求前,該條目將處于等待狀態(tài)。如果另一個(gè)用戶(hù)請(qǐng)求同意顯示,從而你他們可以將你加入他們的花名冊(cè),你必須接受或拒絕請(qǐng)求。Smack 通過(guò)以下三種方式之一操作同意顯示請(qǐng)求:自動(dòng)接受所有的同意顯示請(qǐng)求。自動(dòng)拒絕所有的同意顯示請(qǐng)求。手動(dòng)處理同意顯示請(qǐng)求??梢允褂?Roster.setSubscriptionMode(int subscriptionMode)方法設(shè)置模式。簡(jiǎn)單的客戶(hù)通常使用一個(gè)自動(dòng)接受或拒絕同意

20、顯示請(qǐng)求的模式,而用更多特征的用戶(hù)應(yīng)該使用手動(dòng)處理同意顯示請(qǐng)求的模式,并讓終端用戶(hù)接受或拒絕每一個(gè)請(qǐng)求。如果使用手動(dòng)模式,應(yīng)該聲明一個(gè)信息包監(jiān)聽(tīng)器(PacketListener)來(lái)監(jiān)聽(tīng)有 Presence.Type.SUBSCRIBE 類(lèi)型的顯示信息包。處理收到的信息包(Processinging Packets)Smack 提供一個(gè)使用以下兩個(gè)結(jié)構(gòu)的靈活框架來(lái)處理收到的信息包:org.jivesoftware.smack.PacketCollector 一個(gè)允許你同步的等待新的信息包的類(lèi) org.jivesoftware.smack.PacketListener 一個(gè)異步的通知你收到信息包的

21、接口信息包監(jiān)聽(tīng)器(packet listener)用于事件類(lèi)型的設(shè)計(jì),而信息包收集器(packet collector)有一個(gè)信息包的結(jié)果隊(duì)列,你可以對(duì)其實(shí)施 polling 和blocking 操作。所以,信息包監(jiān)聽(tīng)器在你收到任何一個(gè)信息包,且你想對(duì)其進(jìn)行操作時(shí)是有用的,而信息包收集器在你想等待某個(gè)特殊的信息包時(shí)是有用的。信息包收集器和監(jiān)聽(tīng)器可以通過(guò) XMPPConnection 的實(shí)例來(lái)創(chuàng)建。由org.jivesoftware.smack.filter.PacketFilter 接口來(lái)決定哪個(gè)特殊的信息包將被轉(zhuǎn)交給信息包收集器(PacketCollector)或信息包監(jiān)聽(tīng)器(PacketL

22、istener)。可以在 org.jivesoftware.smack.filter 包中找到許多預(yù)先定義的過(guò)濾器。以下代碼闡釋了如何注冊(cè)一個(gè)信息包收集器(packet collector)和信息包監(jiān)聽(tīng)器(packet listener):/ Create a packet filter to listen for new messages from a particular/ user. We use an AndFilter to combine two other filters.PacketFilter filter = new AndFilter(new PacketTypeFilt

23、er(Message.class),new FromContainsFilter(mar);/ Assume weve created an XMPPConnection name connection./ First, register a packet collector using the filter we created. PacketCollector myCollector = connection.createPacketCollector(filter);/ Normally, youd do something with the collector, like wait f

24、or new packets./ Next, create a packet listener. We use an anonymous inner class for brevity.PacketListener myListener = new PacketListener() public void processPacket(Packet packet) / Do something with theing packet here.;/ Register the listener. connection.addPacketListener(myListener, filter);標(biāo)準(zhǔn)信

25、息包過(guò)濾器(Standard Packet Filters)Smack 包含一套豐富的信息包過(guò)濾器,你也可以通過(guò)信息包過(guò)濾器接口(PacketFilter interface)編寫(xiě)程序來(lái)創(chuàng)建自己的過(guò)濾器。缺省的過(guò)濾器集包括:PacketTypeFilter 某個(gè)特殊的類(lèi)類(lèi)型的信息包過(guò)濾器 PacketIDFilter 擁有特殊的信息包 ID(packet ID)的過(guò)濾器 ThreadFilter 擁有特殊線(xiàn)程 ID(thread ID)的信息包的過(guò)濾器 ToContainsFilter 發(fā)送到某個(gè)特殊地址的信息包的過(guò)濾器 FromContainsFilter -發(fā)送到某個(gè)特殊地址的信息包的過(guò)濾

26、器 PacketExtensionFilter 擁有特殊的信息包擴(kuò)展的信息包的過(guò)濾器 AndFilter 對(duì)兩個(gè)過(guò)濾器實(shí)施邏輯與操作的過(guò)濾器OrFilter -對(duì)兩個(gè)過(guò)濾器實(shí)施邏輯或操作的過(guò)濾器 NotFilter -對(duì)一個(gè)過(guò)濾器實(shí)施邏輯非操作的過(guò)濾器Provider Architecture: Packet Extensions and Custom IQsSmack 提供的體系是堵塞自定義的 XML 信息包擴(kuò)展和 IQ 包分析器的系統(tǒng)(The Smack provider architecture is a system for plugging in custom XML parsing

27、 of packet extensions and IQ packets)。標(biāo)準(zhǔn)的 Smack 擴(kuò)展(Smack Exte nsions)是使用提供者的體系結(jié)構(gòu)搭建的。存在以下兩種類(lèi)型的提供者:IQProvider 將IQ 請(qǐng)求( IQ requests)解析成 Java 對(duì)象(Java objects)PacketExtension 將附屬在信息包上的 XML 子文檔解析成信息包擴(kuò)展實(shí)例(PacketExtension instances) IQProvider默認(rèn)情況下,Smack 致知道如何處理只有類(lèi)似以下幾個(gè)名字空間的子信息包的 IQ 信息包(IQ packets): jabber:i

28、q:authjabber:iq:roster jabber:iq:register因?yàn)樵S多 IQ 類(lèi)型是XMPP 及其擴(kuò)展部分的一部分,所以提供一個(gè)可插入的 IQ 分析機(jī)制。IQ Providers 被程序自動(dòng)的注冊(cè)或通過(guò)創(chuàng)建在你的 JAR 文件的 META-INF 目錄下創(chuàng)建一個(gè) viders 文件。該文件是一個(gè)包含一個(gè)或多個(gè) iqProvider 條目(iqProvider entries)的 XML 文檔,如下例所示:queryjabber:iq:timeorg.jivesoftware.smack.packet.Time每一個(gè) IQ provider 都和一個(gè)元素名(element n

29、ame)和名字空間( namespace)相聯(lián)系。在上面的例子中,元素名是 query,名字空間是 abber:iq:time。如果有多重提供者條目(multiple provider entries)嘗試注冊(cè)并控制相同的名字空間,那么從類(lèi)路徑(classpath)載入的第一個(gè)條目將有優(yōu)先權(quán)。IQ provider 類(lèi)可以實(shí)現(xiàn) IQProvide 接口,或者繼承 IQ 類(lèi)。在前面的例子中,每一個(gè) IQProvider 負(fù)責(zé)解析原始的 XML 流從而創(chuàng)建一個(gè) IQ 實(shí)例。在下面的例子中,bean introspection 將被用于嘗試自動(dòng)使用在 IQ packet XML 中發(fā)現(xiàn)的值設(shè)置IQ

30、實(shí)例的屬性。一個(gè) XMPP 時(shí)間信息包如下所示: 20020910T17:58:35MDTTue Sep 10 12:58:35 2002 from=mary為了讓這個(gè)信息包自動(dòng)的映射成上面的 providers file 中所列的時(shí)間對(duì)象(Time object),它必須有以下幾個(gè)方法: setUtc(String), setTz(String), 和 setDisplay(String)。自動(dòng)檢查(introspection)的服務(wù)將試著自動(dòng)的將字符串值轉(zhuǎn)化成 a boolean, int, long, float, double,或 Class 類(lèi)型。轉(zhuǎn)化成何種類(lèi)型由 IQ 實(shí)例的需要來(lái)

31、決定。 PacketExtensionProvider信息包插件提供者(Packet extension providers)為信息包提供一個(gè)可插入的系統(tǒng),這些信息包是一個(gè) IQ, message 和 presence packets 的自定義名字空間的子元素。每一個(gè)插件提供者(extension provider)使用一個(gè)元素名(element n ame)和名字空間(namespace)在 viders 文件中注冊(cè),如下例所示: xjabber:iq:eventorg.jivesoftware.smack.packet.MessageEvent如果有多重提供者條目(multiple pro

32、vider entries)嘗試注冊(cè)并控制相同的名字空間,那么從類(lèi)路徑(classpath)載入的第一個(gè)條目將有優(yōu)先權(quán)。一旦在一個(gè)信息包中發(fā)現(xiàn)信息包插件,解析器將傳遞到正確的提供者。每一個(gè)提供者可以實(shí)現(xiàn) PacketExtensionProvider接口或者是一個(gè)標(biāo)準(zhǔn)的 Java Bean。在前面的例子中,每一個(gè)插件提供者(extension provider)負(fù)責(zé)解析原始的 XML 流去構(gòu)造一個(gè)實(shí)例。在下面的例子中,bean introspection 將被用于嘗試自動(dòng)使用在信息包插件子元素(packet extension sub-element)中的值設(shè)置類(lèi)的屬性。當(dāng)一個(gè)插件提供者(ex

33、tension provider)沒(méi)有用元素名(element name)和名字空間(namespace)對(duì)注冊(cè)是, Smack 將存儲(chǔ)所有在缺省信息包插件(DefaultPacketExtension)對(duì)象中的最高級(jí)別元素(top-level elements),并匹配到信息包上。信息包屬性(Packet Properties)Smack 提供簡(jiǎn)單的機(jī)制來(lái)將任意的屬性附加到信息包上。每一個(gè)屬性有個(gè)字符串類(lèi)型的名字和一個(gè)值,這個(gè)值或者是 Java原始數(shù)據(jù)類(lèi)型(int, long, float, double, boolean)的,或者是任何可序列化的對(duì)象(Serializable object

34、)(當(dāng)一個(gè) java 對(duì)象實(shí)現(xiàn)了 Serializable 接口時(shí),它就是可序列化的)。使用 API(Using the API)所有主要對(duì)象都有屬性支持,例如消息對(duì)象(Message objects)。以下代碼闡釋了如何設(shè)置屬性: Message message = chat.createMessage();/ Add a Color object as a property. message.setProperty(favoriteColor, new Color(0, 0, 255);/ Add an int as a property. message.setProperty(favo

35、riteNumber, 4); chat.sendMessage(message);獲得這些相同的屬性要用到以下的代碼: Message message = chat.nextMessage();/ Get a Color object property.Color favoriteColor = (Color)message.getProperty(favoriteColor);/ Get an int property. Note that properties are always returned as/ Objects, so we must cast the value to an

36、 Integer, then convert/ it to an favoriteNumber = (Integer)message.getProperty(favoriteNumber).intValue();將對(duì)象作為屬性(Objects as Properties)將對(duì)象作為屬性值是改變數(shù)據(jù)的一個(gè)非常有力和簡(jiǎn)單的方法。但是,你應(yīng)該記住以下幾點(diǎn):l信息包插件(Packet extensions)是向 XMPP 增加額外數(shù)據(jù)的更權(quán)威的方式。使用屬性在某種情況下也許會(huì)比較方便,但是,Smack 將會(huì)控制 XML。l當(dāng)你將 Java 對(duì)象(Java object)作為屬性發(fā)送時(shí),

37、只有在客戶(hù)機(jī)運(yùn)行的 Java 能夠解釋數(shù)據(jù)。所以,可以考慮使用一系列的原始值來(lái)傳遞數(shù)據(jù)。l作為屬性值發(fā)送的對(duì)象必須實(shí)現(xiàn)序列化接口(Serialiable)。除此之外,發(fā)送者和接受者都必須由相同版本的類(lèi),否則在反序列化(de-serializing the object)對(duì)象時(shí)將發(fā)生序列化異常。l序列化的對(duì)象將會(huì)非常大,將會(huì)占用很多的服務(wù)器資源和帶寬。XML 格式(XML Format)當(dāng)前的用于發(fā)送屬性的 XML 格式不是標(biāo)準(zhǔn)的,所以可能不會(huì)得到使用 Smack 的客戶(hù)的認(rèn)可。XML 如下所示(為了更清晰添加了注釋?zhuān)簆rop1123blah2adf612fna9nab當(dāng)前支持的數(shù)據(jù)類(lèi)型有:i

38、nteger, long, float, double, boolean, string, 和 java-object。使用 Smack 調(diào)試(Debugging with Smack)Smack 包含兩個(gè)內(nèi)置的調(diào)試控制臺(tái),他們?cè)试S你在服務(wù)器和客戶(hù)機(jī)建跟蹤 XML 的蹤跡。簡(jiǎn)單的調(diào)試器(lite debugger)是smack.jar 的一部分,加強(qiáng)的調(diào)試器(enhanced debugger)包含在(smackx-debug.jar)中。可以用兩種不同的方法激活調(diào)試模式:1在創(chuàng)建連接前加入以下一行代碼:XMPPConnection.DEBUG_ENABLED = true;2將Java 的系統(tǒng)屬性 smack.debugEnabled 設(shè)置為 true。這一系統(tǒng)屬性可通過(guò)下一命令行設(shè)置:java -Dsmack.debugEnabled=true SomeApp在你的應(yīng)用程序中,如果你想明確的禁用調(diào)試模式,包括使用命令行參數(shù),則在打開(kāi)新的連接前在你的應(yīng)用程序中添加以下一行代碼:XMPPConnection.DEBUG_ENABLED =

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論