質問

以下のコードを使用してメッセージを送信します。

 // Assume we've created an XMPPConnection name "connection".
ChatManager chatmanager = connection.getChatManager();
Chat newChat = chatmanager.createChat("jsmith@jivesoftware.com", new MessageListener() {
    public void processMessage(Chat chat, Message message) {
        System.out.println("Received message: " + message);
    }
});

try {
    newChat.sendMessage("Howdy!");
}
catch (XMPPException e) {
    System.out.println("Error Delivering block");
}

そして、私のJabberidに送信されたメッセージを受け取るための以下は、非同期に。

// Create a packet filter to listen for new messages from a particular
// user. We use an AndFilter to combine two other filters.
PacketFilter filter = new AndFilter(new PacketTypeFilter(Message.class), 
        new FromContainsFilter("mary@jivesoftware.com"));
// Assume we've created an XMPPConnection name "connection".

// First, register a packet collector using the filter we created.
PacketCollector myCollector = connection.createPacketCollector(filter);
// Normally, you'd do something with the collector, like wait for new packets.

// Next, create a packet listener. We use an anonymous inner class for brevity.
PacketListener myListener = new PacketListener() {
        public void processPacket(Packet packet) {
            // Do something with the incoming packet here.
        }
    };
// Register the listener.
connection.addPacketListener(myListener, filter);

メッセージの送信は大丈夫です。

しかし、別のJabberidからメッセージを受信すると、そのJabberidにメッセージを送信するまで痛くなりません。

そしてその後、私はそれから送信されたメッセージを適切に受け取ります。

私はしばしば私のリストにないJabberidからメッセージを受信する必要があり、多くの場合、私のアプリケーションはチャットを開始する側ではありません。

上部コードはSMACKサンプルですが、PacketListenerの実装をインラインで作成しないことを除いて、私のコードは完全に同じです。

役に立ちましたか?

解決

私の問題は、プログラムをテストするときに同じユーザーがログインしたJabberクライアントの使用をやめたときに解決しました。言い換えれば、コードは正しいですが、Jabberクライアントは送信されたメッセージをキャッチし、私のプログラムがキャッチするものではありません。

他のヒント

Smackで作業してからかなりの時間が経ちましたが、着信メッセージに基づいてチャットを開始することができました。

よく覚えていれば、私はある種の「チャットレジストリ」を持っていました、シンプル Map<String, Chat> キーがチャットパートナーIDに等しい場合。それから私は着信メッセージを聞き、Jabber IDを抽出し、このパートナーとのアクティブなチャットセッションを調べました。アクティブなセッションがなかった場合、新しいチャットを作成し、新しいキー/Valeペアをレジストリに追加しました。

少し混乱しています。あなたは言う

上部コードはSMACKサンプルですが、PacketListenerの実装をインラインで作成しないことを除いて、私のコードは完全に同じです。

PacketListenerの実装をせずにメッセージをどのように受信しますか?以下のコードのために開始したチャットから常にメッセージを受け取ると思います

チャットnewChat = chatmanager.createchat( "jsmith@jivesoftware.com"、new MessageListener(){public void processMessage(チャットチャット、メッセージメッセージ){system.out.println( "受信メッセージ:" +メッセージ);}});

しかし、入ってくるメッセージを非同期的に待つためには、PacketListenerが必要になると思います。私はあなたが直面している問題を完全に誤解したかもしれません

(これはコメントだったはずですが、追加する方法を理解することはできません)

しばらく経ちましたが、これを解決しましたか?なぜContainsFilterを作成しているのですか?そのようにして、リスナーは、すべてのパケットではなく、指定されたユーザーからのパケットのみを処理します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top