Smack类库最好的学习资料
即時通訊系列閱讀
1. 登陸IM
Connection.DEBUG_ENABLED = true;//首先激活調試模式1.1 建立連接
首先,在啟動DSM Message時,客戶端通過XMPPConnection與服務器建立連接。建立連接的方式有兩種:
直接連到服務器
Connection conn = new XMPPConnection("localhost");//創建連接 //其中“localhost”是服務器地址,由于我用的是本機,所以是“localhost”。 conn.connect();//接通連接根據配置連接
ConnectionConfiguration config = ConnectionConfiguration(); config.setServiceName("localhost");//還可以設置很多其他屬性,如隱身登陸 Connection conn1 = new XMPPConnection(config); conn1.connect();1.2 用戶登陸
建立連接之后就是用戶登陸了,openfire是支持多終端登陸的,下面的resource就是指的是終端名稱,如Smack、Spark等。登陸的方法有兩個
login(String username, String password)和 login(String username, String password, String resource)具體例子如下,livsun與livsun1是兩個用戶,密碼都是111
conn.login("livsun", "111","Smack"); // resource也可以缺省不設置 conn1.login("livsun1", "111");本文后面默認livsun與livsun1已經登陸,且與服務器的連接分別conn和conn1.
1.3 斷開連接
斷開連接只需調用disconnect()方法,如conn.disconnect();
2. 單人聊天
2.1 發起會話請求
作為一款IM軟件的通信協議,首要功能就是聊天。聊天包含兩種方式,主動向其他人發起會話;也可以接受別人的會話請求。下面是主動對別人發起會話的實現:
conn.getChatManager.createChat(String userID, MessageListener listener);其中userID是本次對話請求的接收方的標志,如UserID是livsun1@z00189374/Smack,livsun1@z00189374是對話請求的接收方,/Smack說明用戶是在哪個終端登陸的,可以缺省不寫。
2.1.1 消息監聽
當想一個用戶發起會話請求,對方接受請求并創建會話后,對方可能發送消息回來,這時需要對接受的消息進行處理。這里要用到MessageListener。
下例將創建一個會話并對收到的消息進行輸出:
Chat chat = conn.getChatManager().createChat("livsun1@z00189374/Smack", new MessageListener(){public void processMessage(Chat chat0, Message message){System.out.println("來自livsun1的消息,內容為"+message.getBody()); } });紅色chat是這次創建的對話對象,它在livsun跟livsun1之間建立一個會話連接;同事處理來自livsun1的消息。如果livsun想要發消息,需要用chat來調用sendMessage方法。具體可見下例:
chat.sendMessage("Hello,I’m livsun");2.1.2 會話請求監聽
通過上面例子可以知道livsun怎樣發送了一個消息給livusn1。但是livsun1需要知道何時livsun發了一個消息給自己,同時還要對這個消息進行處理。Smack提供了會話請求監聽接口ChatManagerListener,每個用戶通過實現該接口,來監聽沒一個會話的創建請求。這里再以livsun1為例來展示一下:
chat.getChatManager. addChatListener(ChatManagerListener listener);ChatManagerListener只有一個方法chatCreated(Chat chat, boolean createdLocally),它用來處理當chat創建時的具體操作。
具體請看下面例子:
conn1.getChatManager().addChatListener(new ChatManagerListener() {public void chatCreated(Chat chat, boolean createdLocal) {//自己創建是指自己調用createChat方法,它也會觸發這個listener//在創建對話時就會制定MessageListener,這樣判斷主要是為了避免重復定義//MessageListerif (createdLocal) {System.out.println("這個chat是自己創建的");}//創建與livsun的對話,這里面可以通過message來獲取發送聊天請求的人信息else {System.out.println("別人想跟我聊天");chat.addMessageListener(new MessageListener() {public void processMessage(Chat chat, Message message) {System.out.println(message.getFrom + "想跟我聊天");chat.sendMessage("你好");}});}}});2.1.3 會話狀態監聽
通常用戶在參加一個會話時,想知道另一個用戶是否正在輸入。會話狀態有五種:active(參加會話), composing(正在輸入), gone(離開), inactive(沒有參加會話), paused(暫停輸入)。
如果想要對會話狀態監聽,需要在用戶登陸之后,會話建立之前,添加ChatStateManager對象,方法為
ChatStateManager.getInstance(XPMMConnectio conn);譬如獲取livsun連接的ChatStateManager代碼是
ChatStateManager csm = ChatStateManager(conn);在客戶端,根據用戶對于一個會話的不同操作,通過ChatStateManager調用方法setCurrentState(ChatState newState, Chat chat)來設置會話的即時狀態。如當livsun正在打字輸入,則可以通過csm.setCurrentState(ChatState.composing, chat)來設置狀態為正在輸入。
在客戶端,還需要對會話狀態改變進行監聽,ChatStateListener繼承MessageListener,方法是stateChanged(Chat chat, ChatState state),由于Chat類沒有直接添加ChatStateListener的方法,因此需要自己編寫一個內部類實現ChatStateListener和MessageListener兩個接口。
請看例子:
private class SelfListener implements ChatStateListener, MessageListener {public void stateChanged(Chat arg0, ChatState arg1){……}Public void processMessage(Chat arg0, Message arg1){……} } MessageListener messageListener = new SelfListener();這樣當會話對方的ChatState發生改變時,stateChanged方法就被觸發。實際上是接收到一個內容為空的Message,Message里通知ChatState改變。
2.2 消息
2.2.1 設置消息的屬性
發送消息的方法sendMessage(),它有兩種實現方式,sendMessage(String text) 和sendMessage(Message message)。第一種就是上面例子中所用的,直接以String為對象,發送一個消息。
為了滿足用戶自定義需求,Smack提供了第二種方式,它可以為message添加一些附加屬性,在message中他們只顯示為String字段。在客戶端接收時,可以通過處理來讓這些字段有特定的意義,譬如設置發送文字的大小,字體,顏色等。
這里需要了解Message這個類,它有三種構造函數,Message()、Message(String text)和Message(String text, Message.Type type)其中text是要發送的內容,Message.Type共有五種,常用的為chat和groupchat。
Message中有很多方法,通過這些方法可以設置或者取得消息的屬性,如addBody()添加消息內容,getBody()獲得消息內容,getFrom()獲取消息的發送者等。Message還有API中沒有提到的方法:setProperty(String name, String value)。通過這個方法我們可以設置很多自己定義的屬性,可參見下面例子:
Message message = new Message(); message.setBody(“This is a Message text”); message.setProperty(“color”,”red”); message.setProperty(“size”, “big”); message.setProperty(“isPictureIn”,”false”); chat.sendMessage(message);這樣就發送了一個包含一些特定屬性的消息。當用戶收到這樣的消息后,通過調用message. getPropertyNames()方法來獲取所有屬性的一個Collection。再通過message.getProprety(String name)來獲取名為name屬性的值,根據用戶自己的定義,可以實現API沒有提供的功能,如改變消息顯示字體顏色。
2.2.2 消息狀態跟蹤
對于發送出去的消息,有時候需要獲取消息發送的情況,如是否發送成功,對方是夠處理等,這些功能需要用到MessageEventManager,通過調用
MessageEventManager. addNotificationsRequests(Message message,boolean offline,boolean delivered,boolean displayed,boolean composing);來對消息的狀態進行標記跟蹤,message為將要發送的消息,剩余四項為可選擇的跟蹤選項,true為跟蹤。
當對其中部分選項進行跟蹤后,下一步操作就是對跟蹤響應結果進行監控。比如你想知道自己發送消息的標記結果,需要創建一個 MessageEvenetManager對象,并調用方法
addMessageEventNotificationListener(MessageEventNotificationListener messageEventNotificationListener);如果你想監控是否有人給自己發送消息跟蹤請求,這時候需要調用方法
addMessageEventRequestListener(MessageEventRequestListener messageEventRequestListener);2.2.3 離線消息
發送消息時,用戶不在線,系統會自動保存這些消息。當用戶登錄后,用戶需要主動去服務器獲取離線消息。主要用到的接口是OfflineMessageMananger。
這里有一個需要注意的地方,那就是用戶login時不能發送Presence(用戶狀態,這個下章講),否則收不到離線消息。
具體可以看下面例子:
如果不執行最后一步操作的話,下次登錄這些離線消息還在。
2.3 文件傳輸
用戶可能希望向其它用戶發送文件。其它用戶有接受,拒絕,或忽略用戶的請求。Smack為用戶輕松發送文件提供了一個簡單的接口。暫只實現文件傳輸,沒有實現文件夾傳輸。
2.3.1 發送文件
要發送或接受文件首先必須創建FileTransferManager類的一個對象,創建方法是
FileTransferManager(XMPPConnection connection);假設現在livsun創建了一個文件傳輸管理對象
fileTransferManager = new FileTransferManager(conn);現在需要創建一個輸出的文件傳輸對象來發送文件。
OutgoingFileTransfer outfile = fileTransferManager(UserID);UserID為完全ID,如果要發送文件給livsun1的話,這里UserID為”livsun1@z00189374/Smack”
通過調用sendFile(file, description)來發送文件,file是文件對象,description是對文件的描述,可以在接受時獲取,并提示用戶,可以根據描述來選擇是否接受。
一個完整的發送文件的過程如下:
FileTransferManager fileTransferManager = new FileTransferManager(conn); OutgoingFileTransfer outfile = manager.createOutgoingFileTransfer("livsun1@z00189374/Smack "); outfile.sendFile(new File("fileToBeSended.txt"), "You won't believe this!");2.3.2 接受文件
如果想知道是否有人發送文件給自己,首先同樣需要創建一個FileTransferManager對象,如
FileTransferManager fileTransferManager1 = new FileTransferManager(conn1);然后對該對象注冊一個監聽器FileTransferListener,來監聽文件傳輸請求。這個監聽器在有文件傳輸時被觸發,它只有一個方法fileTransferRequest(FileTransferRequest request),這個方法來決定文件時接受還是拒絕。
如果要拒絕接受,只要簡單的request.reject()就可以了。
如果要接受,通過request.accept()創建一個IncomingFileTransfer對象,代碼實現:
IncomingFileTransfer infile = request.accept();然后infile調用recieveFile(file)來講文件接受到file中。同時還可以對文件傳輸的狀態進行監聽。監聽及接受文件的代碼實現:
final FileTransferManager fileTransferManager1 = new FileTransferManager(conn); fileTransferManager1.addFileTransferListener(new FileTransferListener() {public void fileTransferRequest(FileTransferRequest request) {// 監查此請求是否應該被接受,shouldAccept由自己實現if(shouldAccept(request)) {//接受則接受文件IncomingFileTransfer infile = request.accept();infile.recieveFile(new File("FILE_PATH"+infile.getName()));} else {request.reject();}} });2.3.3 文件傳輸狀態監聽
在文件傳輸過程中,發送方活接收方需要知道文件傳輸的進度和狀態,需要通過FileTransfer類來實現。
IncomingFileTransfer和OutgoingFileTransfer都繼承了FileTransfer類,此類提供一些方法監視文件傳輸的進展:
- getStatus():文件傳輸可以有多種狀態,協商,拒絕,取消,傳輸過程中,錯誤和完成。這個方法會文件傳輸的當前狀態。
- getProgress():如果文件在傳輸過程中,這個方法會返回一個0到1的數字,0表示傳輸還沒開始,1表示傳輸完成。如果沒在傳輸過程中也可能返回-1。
- isDone():和getProgress()方法類似,不同的是它返回boolean。如果狀態為拒絕,取消,錯誤或完成返回真,否則返回假。
- getError():如果在傳輸過程中發生錯誤,這個方法將會返回所發生的錯誤的類型。
如在接收方監視文件狀態,代碼實現如下:
while(!infile.isDone()) {if(infile.getStatus().equals(Status.ERROR)) {System.out.println("ERROR!!! " + transfer.getError());} else {System.out.println(infile.getStatus());System.out.println(infile.getProgress());} }3. 多人聊天
MultiUserChat,即多人聊天,通過一個用戶創建群組,并邀請其他用戶進入群組,或者其他用戶可以自由進入群組,并在群組里聊天。功能有創建房間、邀請、監聽邀請或拒絕、權限更改、身份改變等。
3.1 創建多人聊天房間
用戶可以創建兩種多人聊天房間:即時房間和永久房間。即時房間按照默認的設置立馬生成,但是在所有參與用戶下線后,該房間注銷。永久房間是創建者通過自己的設置生成,創建者是第一個參與者,并且是該房間的Owner。
要想創建一個房間,首先需要創建一個MultiUserChat的對象 ,MultiUserChat類的構造函數需要兩個參數,當前用戶的連接和房間的JID。如
MultiUserChat chatRoom = new MultiUserChat(conn, “myGroup@conference .z00189374”);通過chatRoom調用create(“nickname”)來創建房間,其中nickName為用戶在房間里顯示的昵稱。
為了使房間成為永久房間并且更加符合用戶的習慣,用戶需要對房間進行一些設置。第一步是獲取房間的配置表格,代碼為
再根據配置表格生成一個用來提交配置的表格,代碼為
Form submitForm = form.createAnswerForm();在對submifForm進行設置一些屬性,屬性包含但不限于以下幾個:
//房間的名稱 submitForm.setAnswer("muc#roomconfig_roomname", "TestUserNumber"); //保證只有注冊的昵稱才能進入房間 submitForm.setAnswer("x-muc#roomconfig_reservednick",true); //設置為永久房間 submitForm.setAnswer("muc#roomconfig_persistentroom",true); //設置房間人數上限,注意,參數不是int!!!!! submitForm.setAnswer("muc#roomconfig_maxusers",list);最后通過chatRoom調用sendConfigurationForm(submitForm)來完成對房間的配置。
3.2 加入聊天室
為了在聊天室里接受或發送消息,首先需要進入聊天室。進入房間之前,先通過用戶連接和房間JID來創建一個MultiUserChat的對象。
MultiUserChat chatRoom1 = new MultiUserChat(conn1, “myGroup@ conference .z00189374”);有三種進入房間的方式:
- 直接加入不需要密碼的房間chatRoom1.join(“nickname”);
- 加入需要密碼的房間chatRoom1.join(“nickName”,”password”);
- 加入需要密碼的房間,且同時設置接受聊天記錄的數目,在一、二中,沒有設置這項,接受的數目有服務器決定。
3.3 群組邀請及群組邀請監聽
如果你建了一個群,你可能希望你的某些好友也加入到這個群,你可以通過對他們發送邀請并監聽結果來實現這個功能。
首先加入一個房間,muc.join(“livsun”),并且確認你有這個房間的邀請資格。然后通過muc調用invite(user,reason)方法,其中user是被邀請人的JID,reason是邀請原因。為了知道邀請結果,這里只能獲取對面拒絕的結果,在發出邀請之前,需要對multiuserChat對象注冊一個監聽器
muc.addInvitationRejectionListener(new InvitationRejectionListener() );為了獲取來自其他人的群組邀請,用戶可以直接通過自己的連接對MultiUserChat注冊一個監聽器。如MultiUserChat.addInvitationListener(conn1, new InvitationListener() )。
下面看一個livsun對livsun1發起邀請,livsun1拒絕對例子:
MultiUserChat muc = new MultiUserChat(conn, “maGroup@conference.z00189374”); muc.join("livsun"); muc.addInvitationRejectionListener(new InvitationRejectionListener() {public void invitationDeclined(String invitee, String reason) {// 被拒絕了} }); //發出邀請 muc.invite("livsun1@z00189374/Smack", "For Dota");//下面是livsun1的處理 MultiUserChat.addInvitationListener(conn1, new InvitationListener() {public void invitationReceived(Connection conn, String room, String inviter, String reason, String password) {// 對請求進行處理,這里是拒絕了MultiUserChat.decline(conn, room, inviter, "I'm working delay");//接受并加入//MultiUserChat muc1 = new MultiUserChat(conn, room);//muc1.join(“livsun1”);} });3.4 在群組中開始一個單人聊天
在群組列表中,你可能想對某個人發起單獨對話,這時可以使用下面方法實現:
Chat chat = muc.createPrivateChat("myGroup@conference.z00189374/livsun1"); chat.sendMessage("Hello there");不過這樣livsun1收到的消息并不是來自于livsun,而是來自myGroup@conference.z00189374
3.5 更改房間成員權限
一個典型的群組具有三種身份的人:創建者、管理員和成員。房間創建者可以改變房間配置、授予用戶所有權和管理權限以及毀掉此房間。房間管理員可以禁止或授予用戶權限和主持者權限。房間成員僅能允許用戶加入房間。這里用到的方法都是MultiUserChat的方法,具體可以去看Smack的API文檔。
還可以對房間其他成員或自己的權限改變進行監聽,方法分別為
3.6 獲取自己曾經加入的房間
MultiUserChat沒有提供方法獲取自己曾經加入的房間,它的getJoinedRooms只能獲取一個好友當前正在加入的房間。而當一個用戶登陸時,用戶需要獲取自己加入過的房間列表,這里需要用到收藏夾Bookmarks。
3.6.1 保存房間信息
首先需要創建一個Bookmarks的對象
BookeMarks bm = new BookeMarks();然后創建BookmarkedConference對象bmConference來保存群組信息。
通過bm調用addBookmarkedConference(BookmarkedConference bookmarkedConference)方法,來將一個BookmarkedConference對象加入Bookmarks中。
最后要把Bookmarks的信息保存到私人專有數據中。先創建PrivateDataManager的一個對象pdmanager,通過pdmanager調用方法setPrivateData(bm)來將數據保存到服務器。
具體代碼實現如下:
//創建收藏夾對象 Bookmarks bookmarks = new Bookmarks(); //創建聊天群組收藏,參數分別為房間的名字,JID,是否自動進入房間,用戶昵稱,密碼 BookmarkedConference conference1 = new BookMarkMain("groupName","myGroup@conference.z00189374",true,"nickname",null); bookmarks.addBookmarkedConference(conference1); PrivateDataManager manager = new PrivateDataManager(conn); manager.setPrivateData(bookmarks);3.6.2 獲取房間信息
當用戶登錄時,用戶去privateData獲取自己的房間信息。用戶需要提供Bookmarks的解析方法來正確獲取保存在PrivateData中的Bookmarks信息。具體方法如下
Bookmarks bm = new Bookmarks(); PrivateDataManager manager = new PrivateDataManager(conn); //提供對Bookmarks的IQ包的解析方法 manager.addPrivateDataProvider(bm.getElementName(), bm.getNamespace(), new Bookmarks.Provider()); //獲取Bookmarks信息 bm = (Bookmarks)manager.getPrivateData(bm.getElementName(), bm.getNamespace()); //獲取Bookmarks中群組的信息。 Collection<BookmarkedConference> c = bm.getBookmarkedConferences();4. 聯系人
每一個用戶都有一個Roster列表,包含多個RosterEntry。在roster中每個用戶用一個RosterEntry表示,它包括:
- 一個XMPP地址(例如 livsun@z00189374)
- 一個您分配給用戶的昵稱(例如 “2b”)
登陸所屬的roster組列表。如果roster登陸不屬于任何組,它將被稱為“unfiled entry”。 在openfire中一個RosterEntry可以同時屬于多個分組。
4.1 獲取聯系人
當用戶通過一個連接登錄服務器后,用戶可以從服務器獲取自己的Roster列表。
Roster roster = conn.getRoster();獲取Roster后可以通過調用roster.getEntries()方法來獲取所有RosterEntry對象,返回類型為Collection。
Collection<RosterEntry> rosterentrys = roster.getEntries();如果想獲得分組信息,需要調用roster.getGroups(), 返回結果是一個Collection。可以在通過rosterGroup.getEntries()獲取每個分組的成員。
對于每個成員的狀態信息,如是否在線,簽名等,可通過roster.gerPresence(RosterEntry)獲取。
4.2 管理好友
用戶可能需要添加其他用戶到自己的Roster中,并可以獲取這些用戶的狀態更新。Smack使用了一種訂閱的Presence的方式來獲取狀態,這樣確保用戶隱私,因為只有允許訂閱才能獲取狀態。
對于訂閱請求,用戶有三種處理方式:接受所有、拒絕所有和手動處理。這需要通過通過Roster.setSubscriptionMode(int subscriptionMode)方法來設置。
添加好友就是一個互相發送狀態訂閱消息的過程。通過調用roster.createEntry(JID,nickname,group)來將一個用戶添加到自己的roster中,并向這個用戶發送一個訂閱presence的請求。
刪除好友只需roster.removeEntry(RosterEntry)就可以將用戶從自己的roster中刪除。
如果用戶想把某位好友從一個群組移動到另外一個群組里,需要用到RosterGroup的removeEntry()和addEntry()方法。假設當前群組名稱為groupNow,即將移入的群組名稱為groupTo,則代碼實現如下
//假設被移動的成員為一個RosterEntry對象rosterEntryMove RosterGroup gourpNow = roster.getGroup(“groupNow”); RosterGroup gourpTo = roster.getGroup(“groupTo”); groupNow.removeEntry(rosterEntryMove); groupTo.addEntry(rosterEntryMove);4.2 狀態修改
Presence是用來管理用戶的在線狀態,它有在線和不在線兩種狀態。如果在線又可以包含很多其他信息,如忙碌、離開等,還可以獲取簽名。
用戶可以通過發送Presence包來改變自己的狀態。首先需要創建一個Presence對象。
這里用戶發送了一個Presence包,更新自己狀態為離開,且發表即時心情為“吃飯去”。.
4.3 隱私設置與黑名單的實現
Privacy是管理其他用戶與自己通信的方法。它是由用戶定義,可以獲取、修改或刪除的,保存在服務器端的隱私設置。它基于三種不同的范圍JID、Group和簽名類型來管理隱私。其中設置包含消息、上線通知、IQ包或所有通信。要實現隱私管理首先需要了解他的三個API
PrivacyListManager: 這是重新獲得并處理服務器隱私列表的主API類。
PrivacyList: 代表一個隱私列表,有一個名字,一組隱私項目。例如,可見或不可見列表。PrivacyItem:阻擋或允許隱私的某個方面。例如,允許我的的朋友看到我們的出席狀態。
首先要從服務器上獲取用戶的PrivacyListManager
PrivacyListManager plm = PrivacyListManager.getInstanceFor(conn);// 再創建一個隱私列表 List<PrivacyItem> privacyItems = new ArrayList<PrivacyItem>();// 然后向這個列表中添加隱私設置 //在線對其隱身 PrivacyItem item = new PrivacyItem(“jid”, false, 1); item.setValue(userJID); item.setFilterPresenceout(true); privacyItems.add(item);// 最后要將這個隱私列表創建到服務器上,并設置為激活狀態。 plm.createPrivacyList(“myList”, privacyItems); plm.setActiveListName(“myList”);// 黑名單實現 PrivacyItem item1 = new PrivacyItem(“group”, false, 1); item1.setValue(“blacklist”); item1.setMessage(true); privacyItems.add(item1);// 其他同JID隱私設置一樣。5. 用戶信息管理
用戶信息包含用戶的姓名、昵稱、住址、電話、頭像和密碼等。
5.1 用戶信息
VCard是用來管理用戶信息的類。為了獲取自己的信息,首先需要新建一個VCard對象,然后通過該對象來加載自己的個人信息。
VCard vCard = new VCard(); vCard.load(conn);通過get方法可以從VCard對象中獲取自己想要的信息。如vCard.getNickName()來獲取自己的昵稱。
如果想設置或修改自己的信息,需要用VCard的set方法。如vCard.setNickName(“2b”).
在設置完成后,需要將vCard的數據保到服務器中,方法是vCard.save(conn)。
上傳頭像需要向對圖片文件進行處理,將其轉化為byte[]數組。假設圖片文件已被轉化成bytes數組。在將圖片用set方法保存前,還需要對其進行編碼,具體如下:
//調用smack接口對bytes編碼String encodedImage = StringUtils.encodeBase64(bytes); //設置card.setAvatar(bytes, encodedImage); //保存 card.save(conn);5.2 賬戶信息
賬戶信息是由AccountManager來管理。它可以創建用戶,修改密碼,獲取用戶信息等。
首先根據連接來創建AccountManager對象,再調用它的changePassword(String password)的方法即完成密碼修改.
6. 與其他IM綁定
Smcak是基于XMPP通信協議的接口,支持與其他基于XMPP的IM軟件互通。
6.1 在服務器端安裝插件
從網上下載gateway插件,推薦使用Kraken IM Gateway ,將Kraken IM Gateway 單獨jar包拷貝到openfire的plugin目錄下,重啟openfire即可;記住,這樣會導致服務暫時終止。
6.2 在客戶端獲取支持綁定的IM
首先通過ServiceDiscoveryManager來查詢當前服務器上的提供服務主體。創建方法如下:
ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(conn);再通過sdm調用discoverItems(entityID),其中entityID代表a given XMPP entity addressed by its JID,本例中為“z00189374”,來獲取包含所有items的DiscoveryItems對象 。代碼為:
DiscoveryItems discoveryItems = sdm.discoveryItems(“z00189374”);// 再通過discoveryItems.getItems()來獲取關于所有Items 的迭代器。 Iterator<DiscoverItems.Item> i = di.getItems();// 在對每個Item進行判斷,觀察是否是一種IM綁定支持。 String entityName = item.getEntityID();if (entityName.startsWith("msn.")){}總結
以上是生活随笔為你收集整理的Smack类库最好的学习资料的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 即时通讯:XMPP基础
- 下一篇: Java并发编程-并发工具包java.u