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
相关产品推荐
相关产品推荐

