0

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つの異なるオブジェクトがあります。しかし、それは機能します。

4

2 に答える 2

2

これまでのところ、Message Carbon(XEP-0280)が問題を解決することを理解しました。Carbonを有効にすると、ユーザーのログに記録されたすべてのリソースにメッセージが配信されます。あなたの場合、1@gmail.comが2@gmail.comにメッセージを送信すると、2@gmail.comのすべてのログに記録されたリソースに配信されます。これがsmackを使用したコードサンプルです。

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

まず、サーバーがメッセージカーボンをサポートしていることを確認してください。その後、通常どおりメッセージを送信します。

于 2016-09-05T18:29:11.037 に答える
0

MessageListenerで、送信者に常に応答しないのはなぜですか?msg.getSender()やgetFrom()のようなものを呼び出すことでそれを得ると思います(私は今モバイルにいます、チェックできません)

于 2011-01-22T02:09:47.793 に答える