0

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

 // 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からメッセージを受信する必要がある場合が多く、チャットを開始する側がアプリケーションではない場合が多いことに注意してください。

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

4

4 に答える 4

3

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

于 2010-11-22T13:41:25.523 に答える
0

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

Map<String, Chat>よく覚えていれば、キーがチャット パートナー ID と同じ単純な "ChatRegistry" のようなものがありました。次に、着信メッセージを聞き、jabber ID を抽出し、このパートナーとのアクティブなチャット セッションを調べました。アクティブなセッションがない場合は、新しいチャットを作成し、新しいキーと値のペアをレジストリに追加しました。

于 2010-11-09T13:15:37.563 に答える
0

お久しぶりです、解決できましたか?なぜ FromContainsFilter を作成しているのですか? このようにして、リスナーはすべてのパケットではなく、特定のユーザーからのパケットのみを処理します。

于 2011-07-29T17:12:31.313 に答える
0

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

上のコードは簡単なサンプルですが、PacketListener 実装をインラインで作成しないことを除いて、私のコードはまったく同じです。

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

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

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

(これはコメントだったはずですが、追加する方法がわかりません)

于 2010-11-11T03:00:39.097 に答える