Дубликат сообщения, полученного в многопользовательском конференц-зале XMPP

Когда device1 отправляет сообщение в конференц-зал "del@conference.jabber.org", сообщение отображается в списке чата, а также отображается дублированное сообщение, которое отправляется конференц-залом "del@conference.jabber.org". Я застрял, почему я получаю дубликат сообщения.

public void setConnection(XMPPConnection connection) {
    this.connection = connection;
    if (connection != null) {
      PacketFilter filter = new MessageTypeFilter(Message.Type.groupchat);
      connection.addPacketListener(new PacketListener() {
        @Override
        public void processPacket(Packet packet) {
          Message message = (Message) packet;
          if (message.getBody() != null) {
            String fromName = StringUtils.parseBareAddress(message.getFrom());
            String[] parts = fromName.split("@");
            String from = parts[0].trim();
            messages.add(from + ":");
            messages.add(message.getBody());
            // Add the incoming message to the list view
            mHandler.post(new Runnable() {
              public void run() {
                setListAdapter();
              }
            });
          }
        }
      }, filter);
    }
  }

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

Button send = (Button) this.findViewById(R.id.sendBtn);
            send.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view) {
                    Message mg = muc.createMessage();
                    String text = textMessage.getText().toString();       
                    mg.setBody(text);
                    Log.i("XMPPChatDemoActivity ", "Sending text ");
                    if (connection != null) {
                        connection.sendPacket(mg);
                        messages.add("Me :");
                        messages.add(text);
                        setListAdapter();
                    }
                    textMessage.setText("");
                }
            });

и это то, что я написал, чтобы подключить конференц-зал

muc = new MultiUserChat(connection, "del@conference.jabber.org");
            muc.join("alias name","password");

вывод, что я получаю при отправке сообщения

me: hello
del: hello

что я хочу, я не дублирую сообщение, когда я отправляю сообщение, т.е.

me: hello

2 ответа

Когда вы находитесь в комнате MUC, вы получаете копии всех сообщений, включая ваши собственные. http://xmpp.org/extensions/xep-0045.html - "и отразить сообщение до полного JID каждого участника".

Таким образом, для MUC (не для прямых сообщений) вы получите дубликат, если войдете как при отправке, так и при получении (при условии, что у вас есть достаточный доступ к почте и т. Д.). Ваши варианты, в основном, либо не регистрировать его при отправке (это вариант, который используют большинство клиентов), либо попытаться выполнить интеллектуальное сопоставление сообщений, чтобы определить, когда вы получили собственное сообщение, и исключить его. Первый вариант гарантирует, что все увидят единообразное представление об упорядочении сообщений, что некоторые люди считают очень полезным.

Может быть, ваш чат-сервер отправил вам ваше сообщение?

Таким образом, вы добавляете одно сообщение вручную в onClickListener а затем то же сообщение, полученное с сервера.

Думаю, будет правильно не добавлять сообщения от onClickListener - добавлять только те, которые отправляет сервер.

Другие вопросы по тегам