OpenFire源码学习之八:MUC用户聊天室

本文详细介绍了OpenFire源码中关于MUC(多用户聊天室)的实现,包括房间属性设置、创建和加入房间、邀请用户等过程。通过解析服务器如何处理客户端请求,展示了OpenFire的MUC服务工作原理。
摘要由CSDN通过智能技术生成

MUC

房间属性设置

以上属性存储在MUCPersistenceManager

private staticConcurrentHashMap<String,MUCServiceProperties> propertyMaps =newConcurrentHashMap<String,MUCServiceProperties>();

创建房间

客户端创建房间案例


第一:客户端发出查询请求

<iq id="wcCqI-57" to="room1@qqgroup.8ntmorv1ep4wgcy" type="get">
  <query xmlns="http://jabber.org/protocol/disco#info"/>
</iq>

服务器将数据包发送到托管在该服务器组件来处理。

routed = routeToComponent(jid,packet, routed);

服务器需要在内存中判断房间是否存在,其次呢,返回外部组件的配置。为确切请求子域的查询将会作出修改。如果没有被发现和使用通配符请求,然后再查询将被提出,在使用通配符这个时候。

然后检查组件是否被托管在此JVM

获取MUC组件的信息

该MUC服务将接收的域MUC的域相匹配的所有数据包服务。这意味着,例如,disco 请求应该由服务本身作出回应,而不是依赖在服务器上处理请求。

根据命名空间找到相应处理——>IQDiscoInfoHandler。

http://jabber.org/protocol/disco#info

 

寻找与所请求的实体相关的DiscoInfoProvider。
我们认为该数据包为单位的接收者的JID的主机。这是DiscoInfoProvider责任提供有关的JID的姓名信息一起用任何可能的请求节点。

所查询的房间节点不存在,按照正常的流程服务器返回错误信息

<iq type="error" id="wcCqI-57" from="room1@qqgroup.8ntmorv1ep4wgcy" to="test2@8ntmorv1ep4wgcy/Spark 2.6.3#android">
  <query xmlns="http://jabber.org/protocol/disco#info"/>
  <error code="404" type="cancel">
    <item-not-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
  </error>
</iq>

客户端第二轮发送:

<presence id="wcCqI-59" to="room1@qqgroup.8ntmorv1ep4wgcy/test2">
  <x xmlns="http://jabber.org/protocol/muc"/>
</presence>

服务器处理:

1.将用户发送的定向存在的实体

  (通知方式发送到该处理程序,当用户发送了一个指向存在的实体。如果存在的发件人是本地的(这个服务器)和目标实体不属于用户的花名册,然后发送更新派驻执导的用户注册表。)
2.广播到所有连接的资源

  (获得由XMPPAddress聊天的用户。仅返回已连接到该JVM的用户。)

 

服务器返回消息:

<message type="groupchat" from="room1@qqgroup.8ntmorv1ep4wgcy">
  <body>确认配置之前已锁住该房间,禁止进入。</body>
</message>

配置钱锁定房间,一面别的用创建一样的,或者申请加入这个房间

<presence id="wcCqI-59" to="test2@8ntmorv1ep4wgcy/Spark 2.6.3#android" 
          from="room1@qqgroup.8ntmorv1ep4wgcy/test2">
<x xmlns="http://jabber.org/protocol/muc#user">
   <item jid="test2@8ntmorv1ep4wgcy/Spark 2.6.3#android" 
          affiliation="owner" role="moderator"/>
         <status code="201"/>
</x>
</presence>

客户端发送IQ:

<iq id="wcCqI-60" to="room1@qqgroup.8ntmorv1ep4wgcy" type="get">
  <query xmlns="http://jabber.org/protocol/muc#owner"/>
</iq>

查询房间拥有者。

服务器返回1:

<message type="groupchat" from="room1@qqgroup.8ntmorv1ep4wgcy" to="test2@8ntmorv1ep4wgcy/Spark 2.6.3#android">
<body>确认配置之前已锁住该房间,禁止进入。</body>
</message>

服务器返回2:

<iq type="error" id="wcCqI-60" from="room1@qqgroup.8ntmorv1ep4wgcy" 
                         to="test2@8ntmorv1ep4wgcy/Spark 2.6.3#android">
   <query xmlns="http://jabber.org/protocol/muc#owner"/>
       <error code="401" type="auth">
       <not-authorized xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
   </error>
</iq>

===============

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值