您的位置:首页 > 移动开发 > Android开发

Android基于XMPP Smack openfire 开发的聊天室(四) 【创建房间、表单;报文】

2014-03-05 15:26 435 查看
这篇就主要讲创建房间和报文吧。

1,创建房间:

其实创建房间很简单,两句话就搞定了。但你要知道,简单的同时,服务器可没帮你配置房间的信息什么的。所以一般用下边的方法来创建房间别人是进不去的。

[java] view
plaincopyprint?

// 使用XMPPConnection创建一个MultiUserChat  

      MultiUserChat muc = new MultiUserChat(conn1, "myroom@conference.jabber.org");  

  

      //创建聊天室  

      muc.create("testbot");  

  

      // 发送一个空表单配置这显示我们想要一个instant room  

        

      muc.sendConfigurationForm(new Form(Form.TYPE_SUBMIT));  

所以咱们还是手动配置一些信息吧,免得留后患。不过在这里要给朋友们提个醒,我觉得不论是哪种方法都很狗屎,为什么狗屎。你看看那MUC,本来就是一个聊天室了,还要让你在聊天室创建另个聊天室,老妈生孩子,然后孩子和老妈并排。狗屎啊,不过不排除我理解错误。希望高人能给与指点。

[java] view
plaincopyprint?

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服务器的话,你下线了就直接把你去除。所以我们要给服务器发送个广播。具体处理那是以后的是了。看看这段报文:

[html] view
plaincopyprint?

<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>  

报文可以根据需要来改服务器的插件。

下边发送的报文:

[java] view
plaincopyprint?

/** 

     * 用户加入时向服务器发送的报文 

     * @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来发送:

[java] view
plaincopyprint?

Constants.conn.sendPacket(leaveXml());  

OK,停一会,手酸了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: