Smack3.1.0とJavaを使用してインスタントメッセージングクライアントを作成しています。私が直面している問題は、特定のドメインのユーザーにメッセージを送信することと関係があります。
たとえば、1@gmail.comと2@gmail.comの2人のユーザーがいます。1@gmail.comは、IMクライアントを介してXMPPにログインします。2@gmail.comは、gmail.comを介してGChatにログインし、2回目はpidginを介してログインします。これで、1@gmail.comのインスタンスが1つと2@gmail.comのインスタンスが2つあります。
Gmailの仕組み。1@gmail.comが2@gmail.comにメッセージを送信すると、Gmailとpidginクライアントの両方が最初のメッセージを受け取ります。ただし、Gmailインスタンスがメッセージに応答する場合、それ以降のすべてのメッセージは1@gmail.comと2@gmail.comのGmailインスタンスの間でのみ送信されます。
IMクライアントでこの動作を模倣したいと思います。それを行う方法は、チャットを設定し、受信者のすべてのインスタンスに最初のIMを送信することだと思います。次に、応答をリッスンするようにMessageListenerを設定します。応答を受け取ったら、2 @gmail.com/resourceを指定して新しいチャットを作成する必要があります。しかし、その後、MessageListenerを2回作成する必要があります。何か案は?これが私が使用しているいくつかのサンプルコードです(このメソッド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);
}
});
更新 私はこの仕事をするために使用した実際のコードで以下の答えを補足したいと思いました:
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
おそらく新しいクラスに組み合わせることができる2つの異なるオブジェクトがあります。しかし、それは機能します。