Я создаю клиент обмена мгновенными сообщениями с использованием Smack 3.1.0 и Java. Проблема, с которой я столкнулся, связана с отправкой сообщений пользователю в определенном домене.Отправка сообщений в определенные домены Smack после начального широковещательного сообщения
Например, у меня есть два пользователя, [email protected] и [email protected] [email protected] входит в XMPP через мой IM-клиент. [email protected] регистрируется в GChat через gmail.com И второй раз через pidgin. Итак, теперь у меня есть один экземпляр [email protected] и 2 экземпляра [email protected]
Способ работы gmail, если [email protected] отправляет сообщение на адрес [email protected], gmail и клиент pidgin получают начальное сообщение. Но затем, если экземпляр gmail отвечает на сообщение, каждое сообщение с этого момента происходит только между [email protected] и экземпляром gmail [email protected]
Я хотел бы подражать этому поведению с моим клиентом IM. Я бы подумал, что для этого нужно настроить чат, отправить начальный IM во все экземпляры получателя. Затем я установил MessageListener для прослушивания ответа. Когда я получу ответ, мне придется создать новый чат, указав [email protected]/resource. Но тогда мне придется писать MessageListener дважды. Есть идеи? Вот пример кода, который я использую (метод AddText()
просто дописывает сообщение на мой разговор панели):
recipient = buddy;
setTitle("Instant Message - "+recipient);
chat = com.andreaslekas.pim.PIM.connection.getChatManager().createChat(recipient.getUser(), new MessageListener() {
public void processMessage(Chat chat, Message msg) {
//if(chat.getParticipant().indexOf('/')!=-1)
addText(msg.getBody(), chat.getParticipant(), true);
}
});
UPDATE Я хотел дополнить ответ ниже с фактическим кодом, который я использовал, чтобы сделать это работа:
chat = com.andreaslekas.pim.PIM.connection.getChatManager().createChat(recipient.getUser(), new MessageListener() {
public void processMessage(Chat new_chat, Message msg) {
if(msg.getFrom().replaceFirst("/.*", "").equals(recipient.getUser()))
{
if(buddy_resource==null || !msg.getFrom().replaceFirst(".*?/", "").equals(buddy_resource.getResource()))
{
buddy_resource = recipient.getResource(msg.getFrom().replaceFirst(".*?/", ""));
chat = null;
chat = com.andreaslekas.pim.PIM.connection.getChatManager().createChat(recipient.getUser()+"/"+buddy_resource.getResource(), new MessageListener(){
public void processMessage(Chat new_chat2, Message msg) {
addText(msg.getBody(), new_chat2.getParticipant(), true);
}
});
}
addText(msg.getBody(), chat.getParticipant(), true);
}
}
});
Подводя итог, я посылаю первое сообщение всем ресурсам адрес получателя и ждать ответа. Когда я получаю ответ, я заменяю текущий объект Chat
новым, который указывает отдельный ресурс, который ответил на исходное сообщение. Код немного грязный с двумя различными объектами MessageListener
, которые, вероятно, можно было бы объединить в новый класс. Но это работает.
msg.getFrom() - это строка. Для ответа на отправителя потребуется Чат newChat = connection.getChatManager(). CreateChat (msg.getFrom(), новый MessageListener() {}); – SpaDusA
Можете ли вы установить для MessageListener значение null? Поскольку у вас уже есть слушатель, который получит ответное сообщение. –
Ну, я могу установить для этого слушателя значение null, но я бы создал новый экземпляр чата, поэтому ни одно из входящих сообщений не будет обработано, потому что старый прослушиватель будет уничтожен. – SpaDusA