Android基於XMPP Smack openfire 開發的聊天室(四) 【建立房間、表單;報文】

yangxi_001發表於2014-03-05

這篇就主要講建立房間和報文吧。

1,建立房間:

其實建立房間很簡單,兩句話就搞定了。但你要知道,簡單的同時,伺服器可沒幫你配置房間的資訊什麼的。所以一般用下邊的方法來建立房間別人是進不去的。

  1. // 使用XMPPConnection建立一個MultiUserChat  
  2.       MultiUserChat muc = new MultiUserChat(conn1, "myroom@conference.jabber.org");  
  3.   
  4.       //建立聊天室  
  5.       muc.create("testbot");  
  6.   
  7.       // 傳送一個空表單配置這顯示我們想要一個instant room  
  8.         
  9.       muc.sendConfigurationForm(new Form(Form.TYPE_SUBMIT));  


所以我們們還是手動配置一些資訊吧,免得留後患。不過在這裡要給朋友們提個醒,我覺得不論是哪種方法都很狗屎,為什麼狗屎。你看看那MUC,本來就是一個聊天室了,還要讓你在聊天室建立另個聊天室,老媽生孩子,然後孩子和老媽並排。狗屎啊,不過不排除我理解錯誤。希望高人能給與指點。

  1. try {  
  2.             // 建立聊天室  
  3.             muc.create(Constants.vCard.getNickName().toString());  
  4.             // 獲得聊天室的配置表單  
  5.             Form form = muc.getConfigurationForm();  
  6.             // 根據原始表單建立一個要提交的新表單。  
  7.             Form submitForm = form.createAnswerForm();  
  8.             // 向要提交的表單新增預設答覆  
  9.             for (Iterator fields = form.getFields(); fields.hasNext();) {  
  10.                 FormField field = (FormField) fields.next();  
  11.                 if (!FormField.TYPE_HIDDEN.equals(field.getType())  
  12.                         && field.getVariable() != null) {  
  13.                     // 設定預設值作為答覆  
  14.                     submitForm.setDefaultAnswer(field.getVariable());  
  15.                 }  
  16.             }  
  17.             // 設定聊天室的新擁有者  
  18.             // List owners = new ArrayList();  
  19.             // owners.add("liaonaibo2\\40slook.cc");  
  20.             // owners.add("liaonaibo1\\40slook.cc");  
  21.             // submitForm.setAnswer("muc#roomconfig_roomowners", owners);  
  22.             // 設定聊天室是持久聊天室,即將要被儲存下來  
  23.             submitForm.setAnswer("muc#roomconfig_persistentroom"true);  
  24.             // 房間僅對成員開放  
  25.             submitForm.setAnswer("muc#roomconfig_membersonly"false);  
  26.             // 允許佔有者邀請其他人  
  27.             submitForm.setAnswer("muc#roomconfig_allowinvites"true);  
  28.             // 能夠發現佔有者真實 JID 的角色  
  29.             // submitForm.setAnswer("muc#roomconfig_whois", "anyone");  
  30.             // 登入房間對話  
  31.             submitForm.setAnswer("muc#roomconfig_enablelogging"true);  
  32.             // 僅允許註冊的暱稱登入  
  33.             submitForm.setAnswer("x-muc#roomconfig_reservednick"true);  
  34.             // 允許使用者修改暱稱  
  35.             submitForm.setAnswer("x-muc#roomconfig_canchangenick"false);  
  36.             // 允許使用者註冊房間  
  37.             submitForm.setAnswer("x-muc#roomconfig_registration"false);  
  38.             // 傳送已完成的表單(有預設值)到伺服器來配置聊天室  
  39.             muc.sendConfigurationForm(submitForm);  
  40.         } catch (XMPPException e) {  
  41.             e.printStackTrace();  
  42.         }  

 

還有個細節,有朋友估計看到我註釋的那裡有\\40的程式碼。原因是在XMPP中的唯一標示JID不允許出現@,所以要轉義。OK?

 

2,報文
有朋友說報文幹嘛,其實我開始也覺得有點多餘,但想想類似QQ群那樣,人下線了,頭像名字變灰色。如果是openfire伺服器的話,你下線了就直接把你去除。所以我們要給伺服器傳送個廣播。具體處理那是以後的是了。看看這段報文:

  1. <iq id="902U0-48" type="set">  
  2.                 <query xmlns="jabber:iq:private">  
  3.                     <storage xmlns="storage:bookmarks">  
  4.                         <conference name="ccc" autojoin="true" jid="ccc@conference.xmpp.chaoboo.com" ></conference>  
  5.                     </storage>  
  6.             </query>  
  7.         </iq>  


報文可以根據需要來改伺服器的外掛。

下邊傳送的報文:

  1. /** 
  2.      * 使用者加入時向伺服器傳送的報文 
  3.      * @return 
  4.      */  
  5.     public IQ joinXml(){  
  6.         IQ iq = new IQ() {  
  7.             public String getChildElementXML() {  
  8.                 StringBuilder buf = new StringBuilder();  
  9.                 buf.append("<query xmlns=\"jabber:iq:private\">");  
  10.                 buf.append("<storage xmlns=\"storage:bookmarks\">");  
  11.                 buf.append("<").append("conference").append(" name=\"ccc\"").append(" autojoin=\"false\"").append("");  
  12.                 buf.append("</storage>");  
  13.                 buf.append("</query>");  
  14.                 return buf.toString();  
  15.             }  
  16.         };  
  17.         iq.setType(IQ.Type.SET);  
  18.         //方法如名,這裡是設定這份報文來至那個JID,後邊的/smack是這段資訊來至哪個端,如spark端就是/spark,android就是/Smack  
  19.         iq.setFrom(Constants.USERNAME+"@naibo.liao.com/Smack");  
  20.         return iq;  
  21.     }  

怎麼傳送呢?可以通過連線,就是XMPPCONNECTION來傳送:

  1. Constants.conn.sendPacket(leaveXml());  


OK,停一會,手痠了

相關文章