• 创建房间


    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());  
  • 相关阅读:
    (二)常问升级小点
    (一)常问基础小点
    Linux之expr命令详解
    Mac--Visual Studio Code 常用快捷键
    git撤销commit操作回到add状态
    ExampleMatcher ,在查询非int 或boolean 字段时要使用 withIgnorePaths() 忽略 int 和boolean 字段,要不然查询不到值
    navicat 用url 连接mongo
    javase 打印杨辉三角
    关系型数据库遵循ACID规则
    Redis介绍
  • 原文地址:https://www.cnblogs.com/hujihon/p/3737896.html
Copyright © 2020-2023  润新知