You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android用XAMPP+Openfire加聊天室遇XMPPError: item-not-found - cancel求助

解决Openfire群聊加入时的XMPPError: item-not-found - cancel错误

这个错误本质上是说你尝试加入的聊天室不存在,或者你用来定位聊天室的JID格式完全错误。结合你的代码,我给你一步步排查和修复的方案:

1. 先检查聊天室JID的拼接逻辑

你的代码里构造聊天室JID的这一行是重灾区:

multiUserChat = manager.getMultiUserChat(roomName+ "@" +CHAT_ROOM_SERVICE_NAME + CHAT_SERVER_SERVICE_NAME);

Openfire的MUC(多用户聊天)服务默认的域名格式是conference.你的服务器域名,比如你的Openfire运行在localhost,那完整的聊天室JID应该是myroom@conference.localhost。

请检查你的CHAT_ROOM_SERVICE_NAME和CHAT_SERVER_SERVICE_NAME的值:

  • 如果CHAT_ROOM_SERVICE_NAME已经是conference.,那再加CHAT_SERVER_SERVICE_NAME(比如localhost)就会变成conference.localhost,这没问题;但如果CHAT_ROOM_SERVICE_NAME是完整的conference.localhost,再拼接服务器名就会得到错误的JID(比如myroom@conference.localhostlocalhost),这肯定找不到房间。

建议把JID构造改成更清晰的写法:

// 假设CHAT_SERVER_SERVICE_NAME是你的Openfire服务器域名,比如"localhost"或者"192.168.1.100"
String roomJid = roomName + "@conference." + CHAT_SERVER_SERVICE_NAME;
multiUserChat = manager.getMultiUserChat(roomJid);

2. 加入前先确认/创建聊天室

如果聊天室还没被创建过,直接调用join()就会触发item-not-found错误。你可以在加入前先检查房间是否存在,不存在就自动创建:

try {
    // 先检查房间是否存在
    if (!multiUserChat.isRoomExists()) {
        // 获取默认配置表单并修改必要参数
        Form configForm = multiUserChat.getConfigurationForm();
        Form submitForm = configForm.createAnswerForm();
        
        // 设置房间为持久化(重启服务器也不会消失)
        submitForm.setAnswer("muc#roomconfig_persistentroom", true);
        // 设置为公开房间,允许任何人加入
        submitForm.setAnswer("muc#roomconfig_publicroom", true);
        // 设置房间名称(可选)
        submitForm.setAnswer("muc#roomconfig_roomname", roomName);
        
        // 创建房间
        multiUserChat.create(submitForm);
    }
    
    // 现在再加入房间
    multiUserChat.join(userName);
} catch (SmackException.NoResponseException e) {
    e.printStackTrace();
    Log.d("xmpp: ", "Chat room join Error: " + e.getMessage());
    sendBroadCast("joinerror", e.getMessage());
} catch (XMPPException.XMPPErrorException e) {
    e.printStackTrace();
    Log.d("xmpp: ", "Chat room join Error: " + e.getMessage());
    sendBroadCast("joinerror", e.getMessage());
} catch (SmackException.NotConnectedException e) {
    e.printStackTrace();
    Log.d("xmpp: ", "Chat room join Error: " + e.getMessage());
    sendBroadCast("joinerror", e.getMessage());
}

3. 检查Openfire的MUC服务状态

登录Openfire的管理后台(默认是http://你的服务器IP:9090),进入服务 > 多用户聊天页面:

  • 确认MUC服务是启用状态
  • 检查服务域名是否和你代码里用的一致(默认是conference.你的服务器域名)

4. 确保连接已正常认证

在调用joinChatRoom之前,一定要确认XMPP连接已经成功建立并且用户已登录:

public void joinChatRoom(String userName, String roomName) { 
    // 先检查连接状态
    if (!connection.isConnected() || !connection.isAuthenticated()) {
        Log.d("xmpp: ", "Error: Not connected or authenticated");
        sendBroadCast("joinerror", "Please connect to server first");
        return;
    }
    
    // 剩下的代码...
}

修改后的完整示例代码

public void joinChatRoom(String userName, String roomName) { 
    // 先检查连接状态
    if (!connection.isConnected() || !connection.isAuthenticated()) {
        Log.d("xmpp: ", "Error: Not connected or authenticated");
        sendBroadCast("joinerror", "Please connect to server first");
        return;
    }

    try { 
        Log.d("xmpp: ", "Service Name: " + connection.getServiceName()); 
    } catch (Exception e) { 
        e.printStackTrace(); 
        Log.d("xmpp: ", "service name error: "+e.getMessage()); 
    } 

    manager = MultiUserChatManager.getInstanceFor(connection); 
    // 修正JID构造逻辑
    String roomJid = roomName + "@conference." + CHAT_SERVER_SERVICE_NAME;
    multiUserChat = manager.getMultiUserChat(roomJid); 

    try { 
        // 检查房间是否存在,不存在则创建
        if (!multiUserChat.isRoomExists()) {
            Form configForm = multiUserChat.getConfigurationForm();
            Form submitForm = configForm.createAnswerForm();
            submitForm.setAnswer("muc#roomconfig_persistentroom", true);
            submitForm.setAnswer("muc#roomconfig_publicroom", true);
            submitForm.setAnswer("muc#roomconfig_roomname", roomName);
            multiUserChat.create(submitForm);
        }
        
        multiUserChat.join(userName); 
    } catch (SmackException.NoResponseException e) { 
        e.printStackTrace(); 
        Log.d("xmpp: ", "Chat room join Error: " + e.getMessage()); 
        sendBroadCast("joinerror", e.getMessage()); 
    } catch (XMPPException.XMPPErrorException e) { 
        e.printStackTrace(); 
        Log.d("xmpp: ", "Chat room join Error: " + e.getMessage()); 
        sendBroadCast("joinerror", e.getMessage()); 
    } catch (SmackException.NotConnectedException e) { 
        e.printStackTrace(); 
        Log.d("xmpp: ", "Chat room join Error: " + e.getMessage()); 
        sendBroadCast("joinerror", e.getMessage()); 
    } 

    // if user joined successfully 
    if (multiUserChat.isJoined()) { 
        Log.d("xmpp: ", "user has Joined in the chat room"); 
        sendBroadCast("join", "done"); 
        //call method to configure room 
        configRoom(roomName); 
        // get Roster 
        getBuddies(); 
        //get user info 
        getUserInfo(userName); 
    } 
}

内容的提问来源于stack exchange,提问作者Sakhawat Hossain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 10:37:37