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