Android基於XMPP Smack openfire 開發的聊天室(四) 【建立房間、表單;報文】
這篇就主要講建立房間和報文吧。
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就是/Smack
- iq.setFrom(Constants.USERNAME+"@naibo.liao.com/Smack");
- return iq;
- }
怎麼傳送呢?可以通過連線,就是XMPPCONNECTION來傳送:
- Constants.conn.sendPacket(leaveXml());
OK,停一會,手痠了
相關文章
- Android基於XMPP Smack openfire 開發的聊天室(六) 【加入房間、許可權錯誤】AndroidMac
- Android基於XMPP Smack openfire 開發的聊天室(二) 【聊天資訊、成員】AndroidMac
- Android基於XMPP Smack openfire 開發的聊天室(三) 【新舊記錄、踢人】AndroidMac
- Android基於XMPP Smack openfire 開發的聊天室(五) 【邀請、被邀請】AndroidMac
- Android基於XMPP Smack openfire 開發的聊天室(一)【會議服務、聊天室列表、加入】AndroidMac
- 基於xmpp openfire smack開發之openfire介紹和部署[1]Mac
- Android基於XMPP Smack openfire 開發的聊天室(七) 【成員狀態、自身狀態】AndroidMac
- 基於xmpp openfire smack開發之Android客戶端開發[3]MacAndroid客戶端
- 基於xmpp openfire smack開發之smack類庫介紹和使用[2]Mac
- 基於xmpp openfire smack開發之Android訊息推送技術原理分析和實踐[4]MacAndroid
- android基於openfire+smack開發之【架構瞭解】AndroidMac架構
- smack和openfire通訊的簡單例子Mac單例
- Android平臺下基於XMPP的IM研究(二 MultiUserChat 聊天室)Android
- Smack 4.1.0-beta1 釋出,XMPP 開發包Mac
- 基於XMPP的即時通訊系統的建立(一)— XMPP基礎概念
- 基於XMPP協議(openfire伺服器)的訊息推送實現協議伺服器
- 基於XMPP的即時通訊系統的建立(四)— 協議詳解協議
- 基於XMPP的即時通訊系統的建立(二)— XMPP詳解
- 基於Openfire Smack開發即時通訊應用、Spark安裝,註冊,登入,退出登入(二)MacSpark
- 基於XMPP協議開發Android即時通訊軟體協議Android
- C#連線基於Java開發IM——OpenfireC#Java
- 基於webapi的websocket聊天室(四)WebAPI
- 【XMPP】Smack原始碼之初步認識Mac原始碼
- 基於 golang + vue + websocket 開發的聊天室GolangVueWeb
- 基於XMPP協議的Android即時通訊系協議Android
- 基於React的表單開發的分析(上)React
- 基於React的表單開發的分析(下)React
- 基於Gin框架的web後端開發(四): 獲取FORM表單引數框架Web後端ORM
- Android平臺下基於XMPP的IM研究(一)Android
- 即時通訊軟體openfire+spark+smackSparkMac
- iOS實現XMPP通訊(一)搭建OpenfireiOS
- 基於XMPP協議Android即時通訊開源應用協議Android
- 【XMPP】Smack原始碼之訊息接收與解析Mac原始碼
- 【XMPP】基於XMPP的即時通訊解決方案
- 聊天室應用開發實踐(二):實現基於 Web 的聊天室Web
- Android學習筆記--基於XMPP的即時通訊Android筆記
- 基於XMPP的即時通訊系統的建立(三)— 程式設計概覽程式設計
- 基於 flask 結合 Redis 的簡單聊天室FlaskRedis