zoukankan      html  css  js  c++  java
  • 改造MUC实现Openfire群

    我的Openfire群实现思路:

    1、群和群成员,要保存到表中。

    2、拉取群列表和群成员列表,均从DB中查询返回。

    3、抛弃老外的“进房间,要发Presence ”。只要此人一上线,就模似一个Presence进行joinRoom,进入他的各群房间。

         多了解LocalMUCRoom 类中:public LocalMUCRole joinRoom(String nickname, String password, HistoryRequest historyRequest, LocalMUCUser user, Presence presence)

        我的模似代码如下:

    View Code
     1 /**
     2      * 模似用户进群(含呢称、含Precense、初始化角色LocalMUCRole)
     3      * @param roomId
     4      * @param packet
     5      * @return
     6      */
     7     public MUCRole getRolesByRoomId(long roomId, Packet packet)
     8     {
     9         MUCRole role = null;
    10         try {
    11             // Get or create the room  获取该群
    12             MUCRoom room = server.getChatRoom(roomId, packet.getFrom());
    13             
    14             //从数据库中查询他的姓名作为昵称(得自己实现)
    15             String nickname = new MUCRoomServiceDao().getUserNickname(packet.getFrom().getNode());
    16             if(nickname == null)
    17             {
    18                 if(packet.getFrom().getResource() != null)
    19                 {
    20                     nickname = packet.getFrom().getResource();
    21                 }
    22                 else 
    23                 {
    24                     nickname = packet.getFrom().getNode();
    25                 }
    26             }
    27             
    28             HistoryRequest historyRequest = null;
    29             String password = null;
    30             
    31             //构建成员进入群的Presence
    32             Presence presence = new Presence();
    33             presence.setTo(room.getJID().toBareJID() + "/" + nickname);    
    34             presence.setFrom(packet.getFrom());
    35             PacketExtension extension = new PacketExtension("x", http://jabber.org/protocol/muc);
    36             presence.addExtension(extension);
    37             
    38             // The user joins the room 用户进入群
    39             role = room.joinRoom(nickname,
    40                     password,
    41                     historyRequest,
    42                     this,
    43                     presence);
    44             
    45             // If the client that created the room is non-MUC compliant then
    46             // unlock the room thus creating an "instant" room
    47             //if (mucInfo == null && room.isLocked() && !room.isManuallyLocked()) {
    48             if (room.isLocked() && !room.isManuallyLocked()) {
    49                 room.unlock(role);
    50                 //server.chatRoomAdded((LocalMUCRoom)room);
    51             }
    52             
    53             addRole(roomId, (LocalMUCRole)role);//添加“用户在某个群中的角色”
    54             
    55         }
    56         catch (UnauthorizedException e) {
    57             sendErrorPacket(packet, PacketError.Condition.not_authorized);
    58         }
    59         catch (ServiceUnavailableException e) {
    60             sendErrorPacket(packet, PacketError.Condition.service_unavailable);
    61         }
    62         catch (UserAlreadyExistsException e) {
    63             sendErrorPacket(packet, PacketError.Condition.conflict);
    64         }
    65         catch (RoomLockedException e) {
    66             sendErrorPacket(packet, PacketError.Condition.recipient_unavailable);
    67         }
    68         catch (ForbiddenException e) {
    69             sendErrorPacket(packet, PacketError.Condition.forbidden);
    70         }
    71         catch (RegistrationRequiredException e) {
    72             sendErrorPacket(packet, PacketError.Condition.registration_required);
    73         }
    74         catch (ConflictException e) {
    75             sendErrorPacket(packet, PacketError.Condition.conflict);
    76         }
    77         catch (NotAcceptableException e) {
    78             sendErrorPacket(packet, PacketError.Condition.not_acceptable);
    79         }
    80         catch (NotAllowedException e) {
    81             sendErrorPacket(packet, PacketError.Condition.not_allowed);
    82         }        
    83         return role;
    84     }

     4、抛弃老外的“以昵称为Key 缓存群成员”。改为以帐号为Key。

         多了解 LocalMUCRoom 类中:private Map<String,MUCRole> occupants = new ConcurrentHashMap<String, MUCRole>();

         在joinRoom办法中:    

    View Code
    1 //以JID作为缓存的key
    2         JID userJid = user.getAddress();
    3         if (userJid != null) {
    4             occupants.put(userJid.toBareJID(), joinRole);
    5         }

     5、详细了解 LocalMUCRoom、LocalMUCUser、LocalMUCRole这三个类,各类中的数据成员、方法。 

  • 相关阅读:
    Java 实例
    为什么很多程序员工作时都戴耳机?
    HTTP状态码大全
    Eclipse怎么切换工作空间
    maven POM.xml内的标签大全详解
    利用html5的FormData对象实现多图上传
    后台定时器注解方式
    js多定时器
    解决ios上微信无法捕获返回键按钮事件的问题
    上传文件,获取表单数据和文件流
  • 原文地址:https://www.cnblogs.com/huazai8204/p/2309022.html
Copyright © 2011-2022 走看看