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

來源:互聯網
上載者:User

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

1,建立房間:

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

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

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

try {// 建立聊天室muc.create(Constants.vCard.getNickName().toString());// 獲得聊天室的配置表單Form form = muc.getConfigurationForm();// 根據原始表單建立一個要提交的新表單。Form submitForm = form.createAnswerForm();// 向要提交的表單添加預設回覆for (Iterator fields = form.getFields(); fields.hasNext();) {FormField field = (FormField) fields.next();if (!FormField.TYPE_HIDDEN.equals(field.getType())&& field.getVariable() != null) {// 設定預設值作為回覆submitForm.setDefaultAnswer(field.getVariable());}}// 設定聊天室的新擁有者// List owners = new ArrayList();// owners.add("liaonaibo2\\40slook.cc");// owners.add("liaonaibo1\\40slook.cc");// submitForm.setAnswer("muc#roomconfig_roomowners", owners);// 設定聊天室是常設聊天室室,即將要被儲存下來submitForm.setAnswer("muc#roomconfig_persistentroom", true);// 房間僅對成員開放submitForm.setAnswer("muc#roomconfig_membersonly", false);// 允許佔有者邀請其他人submitForm.setAnswer("muc#roomconfig_allowinvites", true);// 能夠發現佔有者真實 JID 的角色// submitForm.setAnswer("muc#roomconfig_whois", "anyone");// 登入房間對話submitForm.setAnswer("muc#roomconfig_enablelogging", true);// 僅允許註冊的暱稱登入submitForm.setAnswer("x-muc#roomconfig_reservednick", true);// 允許使用者修改暱稱submitForm.setAnswer("x-muc#roomconfig_canchangenick", false);// 允許使用者註冊房間submitForm.setAnswer("x-muc#roomconfig_registration", false);// 發送已完成的表單(有預設值)到伺服器來配置聊天室muc.sendConfigurationForm(submitForm);} catch (XMPPException e) {e.printStackTrace();}

 

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

 

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

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

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

下邊發送的報文:

/** * 使用者加入時向伺服器發送的報文 * @return */public IQ joinXml(){IQ iq = new IQ() {public String getChildElementXML() {StringBuilder buf = new StringBuilder();buf.append("<query xmlns=\"jabber:iq:private\">");buf.append("<storage xmlns=\"storage:bookmarks\">");buf.append("<").append("conference").append(" name=\"ccc\"").append(" autojoin=\"false\"").append("");buf.append("</storage>");buf.append("</query>");return buf.toString();}};iq.setType(IQ.Type.SET);//方法如名,這裡是設定這份報文來至那個JID,後邊的/smack是這段資訊來至哪個端,如spark端就是/spark,android就是/Smackiq.setFrom(Constants.USERNAME+"@naibo.liao.com/Smack");return iq;}

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

Constants.conn.sendPacket(leaveXml());

OK,停一會,手酸了

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.