Android Smack MUC 400 Bad Request发送群组聊天消息

时间:2016-09-20 11:12:56

标签: android xmpp chat smack

嘿,我正在使用XMPP Smack Library开发聊天应用程序。最近我正在进行群聊,在发送群组留言时,有些留言会丢失,所以收件人不会收到来自发送方的留言。它会给我400个不好的请求。

它有时会起作用。有时不起作用

在这里,我在400个错误的请求中发现了这种消息。

<?xml version="1.0" encoding="UTF-8"?>
<message to="156@abc.com/Android" id="nXlV6-1144" type="error" from="24@confrence.abc.com/156@abc.com.com">
   <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="156@abc.com/Android" id="nXlV6-1411" type="groupchat" from="24@conference.abc.com/156@abc.com">
   <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>

我如何持续发送消息?任何的想法? 提前谢谢。

这是我的代码发送muc消息:

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;
        }

4 个答案:

答案 0 :(得分:2)

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

- 创建群组时,将群组的jid保存在数据库中,例如“somegroup@conference.{domain}.com”

- 创建用于创建xmpp连接的后台任务(这样它将始终连接)

- 登录xmpp后,从数据库中获取组名并连接到它们

另外,在openfire中,群聊&gt;群聊设置&gt;编辑图标&gt;默认房间设置&gt;选中“Make Room Persistant”

另外,在其他设置中&gt;永远不要踢空闲用户

答案 1 :(得分:0)

我正在工作&#34;看到并交付&#34;在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);

在您的情况下,首先尝试使用简单数据包。如果一切正常,那么逐个添加扩展名,看看你收到错误的地方,谢谢

答案 2 :(得分: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;
}

很抱歉,如果它看起来很破旧,如果我错过任何功能,请告诉我,但这是我正在使用的工作代码

答案 3 :(得分:0)

试试这个,

我修改了你的上一个功能

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);
}