2016-09-20 5 views
1

Привет, я занимаюсь разработкой чата с помощью XMPP Smack Library. Недавно я работаю над групповым чатом. При отправке сообщения группы некоторое сообщение будет отключено, поэтому получатель не получит сообщение со стороны отправителя. это даст мне 400 плохих запросов.Android Smack MUC 400 Bad Запрос группы отправки Сообщение чата

Он работает иногда. а иногда и не работает

здесь я нашел этот вид сообщения в 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> 

Как я могу отправить сообщение настойчиво? Есть идеи? Благодарим вас в Advance.

вот мой код отправка 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; 
     } 

ответ

0

Я работаю на «видели и доставлены» в MUC и перед этим вопросом, когда ответив с таким же идентификатором пакета, все еще тестируются, но я думаю, что в в вашем случае вы должны переместить ваше соединение xmpp в фоновый сервис и после подключения к xmpp при запуске устройства подключитесь ко всему muc в своей базе данных. Таким образом, вы всегда будете подключены к группам.

причина: по мне, когда другой пользователь не подключен к muc, и вы отправляете сообщение или когда вы отвечаете группе с тем же идентификатором пакета.

Примечание: Я использую multiuserchat.sendmessage отправить групповое сообщение, и chat.sendmessage отправить сообщение одному пользователю

SMACK 4,1

** Обновление **

I исправил его, создав новый пакет вместо того, чтобы модифицировать тот, который я получаю.

вот пакет

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

В вашем случае сначала попробуйте простой пакет. если все работает хорошо, а затем добавить расширение один за другим, и увидеть, где вы получите сообщение об ошибке, спасибо

+0

HI Я думаю, что это то же самый вопрос пакета, но до сих пор я подтверждаю обновление с надрезом кодом Многопользовательских отправить сообщение ... у меня также проблемы с подключением много раз отключается –

+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

Да, пригласить друзей проверить мой другой ответ на этот вопрос, теперь я добавлю. Для группового общения я сделал фоновое обслуживание для подключения 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, получить имена групп из базы данных и подключения к ним

также, в Openfire, групповой чат> Настройки группового чата> Значок редактирования > Настройка по умолчанию номера> Проверить «потесниться настойчивым»

также, в других местах> Никогда не пинать Idle пользователей

+0

ok дайте мне попробовать это .. :) Спасибо за ответ. – LearnPainLess

+0

Спасибо, что это работает. но мои сообщения не получают никому. – LearnPainLess

+0

также перейдите в openfire> вкладка «Настройки сервера»> «Офлайн-сообщения» (меню слева)> «Проверить», «Сохранить или удалить» (и установить максимальный размер для каждого пользователя). После этого вы также установили прослушиватель пакетов или прослушиватель строфы для приема пакеты –