2016-09-20 92 views
1

嘿,我正在使用XMPP Smack Library开发聊天应用程序。最近我正在进行群聊,在发送群组消息时,一些消息将被丢弃,因此接收者不会从发送方接收消息。它会给我400个不好的要求。Android Smack MUC 400错误请求发送群组聊天消息

它有时正在工作。有时不工作

在这里我发现这种类型的消息在400坏请求。

<?xml version="1.0" encoding="UTF-8"?> 
<message to="[email protected]/Android" id="nXlV6-1144" type="error" from="[email protected]/[email protected]"> 
    <received xmlns="urn:xmpp:receipts" id="nXlV6-1142" /> 
    <error code="400" type="modify"> 
     <bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" /> 
    </error> 
</message> 

如果成功发送消息,它会给这种消息。

<?xml version="1.0" encoding="UTF-8"?> 
<message to="[email protected]/Android" id="nXlV6-1411" type="groupchat" from="[email protected]/[email protected]"> 
    <body>eyu4u4</body> 
    <chatDetail xmlns="jabber:x:oob"> 
     <UID>156</UID> 
     <time>04:20 PM</time> 
     <user_icon>24_group_icon.jpg</user_icon> 
     <SentTime>1474368652960</SentTime> 
     <USERName>vasudev89</USERName> 
     <user_name>cryan</user_name> 
     <message>eyu4u4</message> 
     <type>group</type> 
     <phone_number>24</phone_number> 
    </chatDetail> 
    <request xmlns="urn:xmpp:receipts" /> 
</message> 

我该如何持续发送消息?任何想法? 预先感谢您。

这里是我的代码发送睦消息:

public boolean sendGroupMessage(Message message, String strGroupID) { 

      DeliveryReceiptRequest.addTo(message); 
      try { 
       Log.i(TAG, "sendGroupMessage"); 
       //Log.i("JOIN MUC","To join group chat: " + groupChat.getClassId()); 

       // Get the MultiUserChatManager 
       MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(AbstractXMPPConnection); 

       // Create a MultiUserChat using an XMPPConnection for a room 
       MultiUserChat muc = manager.getMultiUserChat(strGroupID + AppWSConstants.XMPP_JID_GROUP_CHAT_SUFFIX); 
       muc.sendMessage(message); 
       return true; 
      } catch (NotConnectedException e) { 
       e.printStackTrace(); 
      } 
      return false; 
     } 

回答

0

我的“看到并发表”中MUC,并回答后面具有相同的分组ID时,还在测试这个问题面临的工作,但我认为,在你的情况你应该将你的xmpp连接移动到后台服务,并且在设备启动时连接到xmpp后,连接到数据库中的所有muc。这样你将永远被连接到组。

原因:根据我,当其他用户没有连接到muc,并且您发送消息或当您回复具有相同数据包id的组时。

注:我使用multiuserchat.sendmessage发送群消息和chat.sendmessage要发送消息给单个用户

SMACK 4.1

**更新**

我通过创建新数据包来修复它,而不是修改我正在接收的数据包

这里是数据包

Message msgg = new Message(); 
msgg.setBody(message.getPacketID()); 
msgg.setSubject(MessageModel.CHAT_STATUS_SEEN + ""); 
XmppBase.sendMUCChatMsg(msgg); 

在你的情况下,先尝试简单的数据包。如果一切运作良好,然后逐个增加分机上,看看你的错误,谢谢

+0

HI我认为这是同一个包的问题,​​但我仍确认的多SNIP代码更新用户发送消息...我也有连接问题,它被断开很多次 –

+0

我有断开连接问题,但是当我将它移动到后台服务时,它被修复了。 还有一件事,如果您使用的是openfire服务器,启用存档聊天功能,并且在发送消息“不良请求”后,看看用户是否断开连接 也应该使用yourmuc.sendmessage发送组消息,而不是chat.sendmessage。 注意:发送消息时不要指定** TO **或** FROM ** –

+0

我已经更新了我上面的发送代码。 –

0

我有一个XmppBase类在这里我把我所有的XMPP代码

所有听众在单独的文件夹

连接存储在静态变量中,我使用

Utils。的getConnection()

// this function m calling from background service and everywhere if not connectect to xmpp 
public static XMPPConnection CreateXmppConnection() { 
    if (Utils.getConnection() == null) { 
     try { 
      Boolean isConnected = new XmppAsync(mUsername, mPassword,context).execute().get(); 
      if (isConnected && Utils.getConnection() != null) { 
       RegisterConnListeners(Utils.getConnection()); 
       updateMyProfileImg(); 

       // connect to all groups 
       DBAdapter adapter = new DBAdapter(context); 
       adapter.openForRead(); 
       List<UserDetail> groups = new ArrayList<>(); 
       adapter.addAllGroups(groups); 
       adapter.addPastChatGroups(groups); 
       adapter.close(); 

       for(UserDetail g : groups) 
       { 
        CreateXmppMUCSession(g.getGroupTemp()); 
       } 

       return Utils.getConnection(); 
      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } else 
     return Utils.getConnection(); 
} 

// get muc chat manager 
public static MultiUserChatManager getMucManager() { 

    if(mucManager != null) 
     return mucManager; 

    if (Utils.getConnection() != null) { 
     return MultiUserChatManager.getInstanceFor(Utils.getConnection()); 
    } else { 
     if (CreateXmppConnection() != null) 
      return MultiUserChatManager.getInstanceFor(Utils.getConnection()); 
     else { 
      Log.v("error", "Some Error Occured"); 
      Toast.makeText(context, "Cant Connect to Xmpp", Toast.LENGTH_SHORT).show(); 
      return null; 
     } 

    } 

} 

// create muc session and m passing group name - call when you open chat page 
public static void CreateXmppMUCSession(String gName) 
{ 
    RegisterGroupChatListeners(gName); 
} 

// connect to muc if not already connected 
public static void RegisterGroupChatListeners(String groupName) 
{ 
    try { 
     mStateManager = getChatStateManager(); 
     multiUserChat = getMUC(groupName); 
     // if(multiUserChat != null) { 
     multiUserChat.addMessageListener(new MyMUCMessageListener()); 
     try { 
      if (!multiUserChat.isJoined()) { 
       DiscussionHistory discussionHistory = new DiscussionHistory(); 
       discussionHistory.setMaxStanzas(0); 
       multiUserChat.join(new MyPrefrence(context).getUsername().split("@")[0], "123", 
         discussionHistory, SmackConfiguration.getDefaultPacketReplyTimeout()); 
      } 
     } catch (SmackException.NoResponseException e) { 
      e.printStackTrace(); 
     } catch (XMPPException.XMPPErrorException e) { 
      e.printStackTrace(); 
     } catch (SmackException.NotConnectedException e) { 
      e.printStackTrace(); 
     } 
     // } 
    } 
    catch (Exception ex) 
    { 
     // 
    } 

} 

// get muc 
public static MultiUserChat getMUC(String groupName) 
{ 
    // Log.v("nick",multiUserChat.getNickname() + " , g = " + groupName); 
    // if(multiUserChat != null && multiUserChat.getRoom().contains(groupName)) 
    // { 
    //  return multiUserChat; 
    // } 

    if (Utils.getConnection() != null) { 
     MultiUserChatManager chatManager = getMucManager(); 
     if (chatManager != null) { 
      return chatManager.getMultiUserChat(groupName); 
     } else { 
      Toast.makeText(context, "Cannot create Chat", Toast.LENGTH_SHORT).show(); 
      return null; 
     } 
    } else { 
     if (CreateXmppConnection() != null) { 
      MultiUserChatManager chatManager = getMucManager(); 
      if (chatManager != null) { 
       return chatManager.getMultiUserChat(groupName); 
      } else { 
       Toast.makeText(context, "Cannot create Chat", Toast.LENGTH_SHORT).show(); 
       return null; 
      } 
     } 
     else { 
      Toast.makeText(context, "Cannot create Chat", Toast.LENGTH_SHORT).show(); 
      return null; 
     } 

    } 
} 

,每当我要发送的消息,我只是把这个

public static Boolean sendMUCChatMsg(Message msg) 
{ 
    if(multiUserChat != null) 
     try { 
      multiUserChat.sendMessage(msg); 

      return true; 
     } catch (SmackException.NotConnectedException e) { 
      e.printStackTrace(); 
     } 
    return false; 
} 

很抱歉,如果它看起来clumpsy,如果我错过了有什么功能让我知道,但这是工作代码我使用

+0

你能告诉我如何邀请朋友吗?和GroupChat在某些时候从openfire删除。 可以请你帮忙。 – LearnPainLess

+0

是的,为了邀请朋友检查我对这个问题的另一个答案,我现在将添加。 为groupchat,我做了一个后台服务的xmpp连接,所以请按照下列步骤: –

+0

抱歉无法输入评论,我会为此发布新的答案 –

1

试试这个,

我修改你的最后一个函数

static MultiUserChat multiUserChat; 
// call this function when you open the chat window 
private void CreateGroupConnection(String strGroupID) { 

// Get the MultiUserChatManager 
      MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(AbstractXMPPConnection); 

      // Create a MultiUserChat using an XMPPConnection for a room 
      MultiUserChat multiUserChat = manager.getMultiUserChat(strGroupID + AppWSConstants.XMPP_JID_GROUP_CHAT_SUFFIX); 

return multiUserChat; 
} 

// whenever sending message from chat call this 

publilc static void sendMucMessage(Message message){ 
if(multiUserChat != null) 
multiUserChat.sendMessage(message); 
} 
2

@LearnPainLess,请按照下列步骤来解决群聊问题

- 当创建组,保存组的JID在数据库中,像“[email protected]{domain}.com”

- 创建后台任务创建XMPP连接(这样一来就会始终连接)中XMPP

-after记录,从数据库中获取的组名,并连接到他们

此外,在Openfire的群聊>群聊设置>编辑图标>默认房间设置>选中“让路持久性”

此外,在其他设置>从不踢空闲用户

+0

好吧,让我试试这个.. :) 感谢您的回复。 – LearnPainLess

+0

谢谢你的作品。但我的邮件没有收到任何用户。 – LearnPainLess

+0

也去openfire>服务器设置选项卡>离线消息(左菜单)>检查存储,存储或删除(并设置每个用户的最大大小) 这样做之后,您还设置数据包侦听器或节侦听器接收包 –

相关问题