专业IM即时通讯软件开发,值得信赖!

xmpp openfire+Smack4.3群聊

openfire 云聊IM 64℃

xmpp的群聊是类似于聊天室的设计,而不同于QQ、微信里的群聊。

就是每次退出了账号登陆,再重新登录的时候确实是获取不了群的,那是因为在你退出登陆的时候,也会把你的群都退出了 。

所以,群聊(聊天室)的离线消息也是没有实现的,需要自己扩展openfire的功能。

不过群聊(聊天室)如果在创建的时候设置了submitForm.setAnswer(“muc#roomconfig_persistentroom”, true);就会永久保存下来,所以也就是说房间是存在的,只是人员不在,在这里说说我们项目实现的思路:把群信息保存进用户本地数据库里面,如用户A创建了群,就会把群账号、群主以及群成员等一些信息保存到本地,等用户A上线了,就会去读取本地数据库里的群信息,在初始化的时候调用方法进入会议室并设置好消息监听。

建群

/**
 * 创建群聊房间
 * @param groupName 群名称
 * @param users 创建群完成后添加的群成员
 * @param nickName 群昵称
 * @return
 */
public MultiUserChat createChatRoom(String groupName, List<User> users, String nickName) throws Exception {
    //组装群聊jid,这里需要注意一下,群jid的格式就是  群名称@conference.openfire服务器名称
    String jid = groupName + "@conference." + connection.getServiceName();
    EntityBareJid groupJid = JidCreate.entityBareFrom(jid);

    MultiUserChat muc = getMultiUserChatManager().getMultiUserChat(groupJid);
    muc.create(Resourcepart.from(nickName));
    // 获得聊天室的配置表单
    Form form = muc.getConfigurationForm();
    // 根据原始表单创建一个要提交的新表单。
    Form submitForm = form.createAnswerForm();

    // 设置聊天室的新拥有者
    List<String> owners = new ArrayList<>();
    owners.add(AppInfo.user.getName()+ "@" + XmppUtils.getXmmpUtils().getConnection().getServiceName());

    //这里的用户实体我要说一下,因为这是我这个项目的实体,实际上这里只需要知道用户的jid获者名称就可以了
    if(users != null && !users.isEmpty()) {
        for (int i = 0; i < users.size(); i++){  //添加群成员,用户jid格式和之前一样 用户名@openfire服务器名称
            EntityBareJid userJid = JidCreate.entityBareFrom(users.get(i).getUsername() + "@" + XmppUtils.getXmmpUtils().getConnection().getServiceName());
            owners.add(userJid + "");
        }
    }


    submitForm.setAnswer("muc#roomconfig_roomowners", owners);
    //设置为公共房间
    submitForm.setAnswer("muc#roomconfig_publicroom", true);
    // 设置聊天室是持久聊天室,即将要被保存下来
    submitForm.setAnswer("muc#roomconfig_persistentroom", true);
    // 房间仅对成员开放
    submitForm.setAnswer("muc#roomconfig_membersonly", false);
    // 允许占有者邀请其他人
    submitForm.setAnswer("muc#roomconfig_allowinvites", true);
    //进入不需要密码
    submitForm.setAnswer("muc#roomconfig_passwordprotectedroom",  false);

    // 能够发现占有者真实 JID 的角色
    // submitForm.setAnswer("muc#roomconfig_whois", "anyone");
    // 登录房间对话
    submitForm.setAnswer("muc#roomconfig_enablelogging", true);
    // 仅允许注册的昵称登录
    submitForm.setAnswer("x-muc#roomconfig_reservednick", false);
    // 允许使用者修改昵称
    submitForm.setAnswer("x-muc#roomconfig_canchangenick", true);
    // 允许用户注册房间
    submitForm.setAnswer("x-muc#roomconfig_registration", false);
    // 发送已完成的表单(有默认值)到服务器来配置聊天室
    muc.sendConfigurationForm(submitForm);
    //添加群消息监听
    muc.addMessageListener(new InGroupChatMessageListener(jid));
    return muc;
}

发送群消息

/**
 * 发送群聊普通消息
 * @param groupName
 * @param body
 */
public void sendChatGroupMessage(String groupName, String body) throws Exception {
    //拼凑jid
    String jid = groupName + "@conference." + connection.getServiceName();
    //创建jid实体
    EntityBareJid groupJid = JidCreate.entityBareFrom(jid);
    //群管理对象
    MultiUserChatManager multiUserChatManager = MultiUserChatManager.getInstanceFor(connection);
    MultiUserChat multiUserChat = multiUserChatManager.getMultiUserChat(groupJid);
    //发送信息
    multiUserChat.sendMessage(body);
}

邀请其他人入群

/**
 * 加入群聊会议室
 * @param groupName
 * @param nickName
 * @return
 * @throws Exception
 */
public MultiUserChat joinMultiUserChat(String groupName, String nickName) throws Exception {
    //群jid
    String jid = groupName + "@conference." + connection.getServiceName();
    //jid实体创建
    EntityBareJid groupJid = JidCreate.entityBareFrom(jid);
    
    //获取群管理对象
    MultiUserChatManager multiUserChatManager = MultiUserChatManager.getInstanceFor(connection);
    //通过群管理对象获取该群房间对象
    MultiUserChat multiUserChat = multiUserChatManager.getMultiUserChat(groupJid);
    
    MucEnterConfiguration.Builder builder = multiUserChat.getEnterConfigurationBuilder(Resourcepart.from(nickName));
    //只获取最后99条历史记录
    builder.requestMaxCharsHistory(99);
    MucEnterConfiguration mucEnterConfiguration = builder.build();
    //加入群
    multiUserChat.join(mucEnterConfiguration);
    return multiUserChat;
}

退群

/**
 * 退出群聊
 * @param groupName
 * @throws XmppStringprepException
 */
public void quitRoom(String groupName) throws Exception {
    String jid = groupName + "@conference." + connection.getServiceName();
    EntityBareJid groupJid = JidCreate.entityBareFrom(jid);
    
    MultiUserChatManager multiUserChatManager = MultiUserChatManager.getInstanceFor(connection);
    MultiUserChat multiUserChat = multiUserChatManager.getMultiUserChat(groupJid);
    //退出群
    multiUserChat.leave();
}
喜欢 (0)
仿微信聊天软件开发