2011-01-22 2 views
0

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

ответ

0

В вашем MessageListener почему бы не всегда отвечать отправителю? Я думаю, вы получили это, вызвав что-то вроде msg.getSender() или getFrom() (сейчас я на мобильном телефоне, не могу проверить)

+0

msg.getFrom() - это строка. Для ответа на отправителя потребуется Чат newChat = connection.getChatManager(). CreateChat (msg.getFrom(), новый MessageListener() {}); – SpaDusA

+0

Можете ли вы установить для MessageListener значение null? Поскольку у вас уже есть слушатель, который получит ответное сообщение. –

+0

Ну, я могу установить для этого слушателя значение null, но я бы создал новый экземпляр чата, поэтому ни одно из входящих сообщений не будет обработано, потому что старый прослушиватель будет уничтожен. – SpaDusA

0

До сих пор я понял, что Message Carbon (XEP-0280) решит вашу проблему. Если вы включите углерод, он будет распространять сообщения на все зарегистрированные ресурсы пользователя. В вашем случае, если [email protected] отправит сообщение на адрес [email protected], оно будет распространено на все зарегистрированные ресурсы [email protected] Вот пример кода с использованием привкусом,

CarbonManager cm = CarbonManager.getInstanceFor(connection); 
cm.enableCarbons(); 
cm.sendCarbonsEnabled(); 

Сначала убедитесь, что ваш сервер поддерживает сообщение Carbon. Затем отправьте сообщение как обычно.