2016-11-28 2 views
11

Я создал приложение чата с использованием сервера Openfire (xmpp). Индивидуальные чаты работают нормально, и сообщения доставляются мгновенно. Но когда мы отправляем сообщение внутри группы, первое сообщение задерживается, а второе сообщение доставляется мгновенно.Отложенная групповая передача сообщений в openfire

MultiUserChatManager groupChat = 
      MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name"); 
groupChat.send("Message object"); 

Почему первое сообщение задерживается?

MUC Творение

MultiUserChatManager mchatManager = MultiUserChatManager.getInstanceFor(xmpptcpConnection); 
     MultiUserChat mchat = mchatManager.getMultiUserChat(group); 
     if (!mchat.isJoined()) { 
     Log.d("CONNECT", "Joining room !! " + group + " and username " + username); 
     boolean createNow = false; 
     try { 
      mchat.createOrJoin(username); 
      createNow = true; 
     } catch (Exception e) { 
      Log.d("CONNECT", "Error while creating the room " + group + e.getMessage()); 
     } 

     if (createNow) { 

      Form form = mchat.getConfigurationForm(); 
      Form submitForm = form.createAnswerForm(); 

      List<FormField> formFieldList = submitForm.getFields(); 
      for (FormField formField : formFieldList) { 
      if(!FormField.Type.hidden.equals(formField.getType()) && formField.getVariable() != null) { 
       submitForm.setDefaultAnswer(formField.getVariable()); 
      } 
      } 

      submitForm.setAnswer("muc#roomconfig_persistentroom", true); 
      submitForm.setAnswer("muc#roomconfig_publicroom", true); 

      mchat.sendConfigurationForm(submitForm); 

      //mchat.sendConfigurationForm(
      // new Form(DataForm.Type.submit)); //this is to create the room immediately after join. 
     } 
     } 
     Log.d("CONNECT", "Room created!!"); 
     return true; 
    } catch (SmackException e) { 
     e.printStackTrace(); 
    } catch (XMPPException.XMPPErrorException e) { 
     e.printStackTrace(); 
    } 
+0

Возможно, вы сохраняете входящее сообщение внутри базы данных? Если да, я думаю, что это большая проблема, создавая базу данных, чем сообщение с задержкой ... – Opiatefuchs

+0

Это только первое сообщение. Когда мы переключаем группу, то это происходит в первом сообщении. –

+0

Если это просто проблема с базой данных, то происходит снова и снова –

ответ

3

Там будет вопрос о создании и своего рода побочный эффект распространяется на передачу.

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

Как исправить.

На этапе создания, эта часть должна быть улучшена:

if (!mchat.isJoined()) { 
     Log.d("CONNECT", "Joining room !! " + group + " and username " + username); 
     boolean createNow = false; 
     try { 
      mchat.createOrJoin(username); 
      createNow = true; 
     } catch (Exception e) { 
      Log.d("CONNECT", "Error while creating the room " + group + e.getMessage()); 
     } 

С просто:

boolean createNow 
try 
{ 
    if (!mchat.isJoined()) 
    { 
     createNow = mchat.createOrJoin(username); 
    } 
} 
catch (Exception e) 
{ 
    throw new Exception("ERROR!"); 
} 

и после этого invokation:

mchat.sendConfigurationForm(submitForm); 

добавить:

if (!mchat.isJoined()) { 
    mchat.join(username); 
} 

созданиеOrJoin метод о создании OR join (как говорится в названии): чтобы активировать чат, вы должны присоединиться к нему после фазы создания.

Однако createOrJoin имеет возможно неожиданное поведение из-за двойную проверку о уже соединенных номерах, чтобы сохранить Syncro между сессией клиентом и сессией на сервере, поэтому mchat.join()должен вызываться после. Явное название может звучать так: mustCreateBeforeOrCanJoinDirectly()

+0

Извините, но не работает. –

+0

он может задержать серверную сторону ???? –

+0

перезапустите Openfire, если сможете, и попробуйте с новым чатом. Если не работает снова, мы можем проверить что-то другое (однако я предлагаю использовать мой фрагмент). У меня нет вопросов о первом сообщении вообще ... – MrPk

Смежные вопросы