這篇就主要講建立房間和報文吧。
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,停一會,手酸了