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 接收消息,而且我的应用程序通常不是开始聊天的一方。

上面的代码是 smack 示例,但我的代码完全一样,只是我没有创建 PacketListener 内联实现。

4

4 回答 4

3

当我停止使用 Jabber Client 并在测试程序期间登录相同的用户时,我的问题解决了。换句话说,代码是正确的,但 Jabber 客户端会捕获已发送的消息,并且我的程序无法捕获任何内容。

于 2010-11-22T13:41:25.523 回答
0

自从我使用 smack 以来已经有一段时间了,但我设法根据收到的消息开始聊天。

如果我没记错的话,我有某种“ChatRegistry”,一个简单Map<String, Chat>的键等于聊天伙伴 ID。然后我收听传入的消息,提取 jabber id 并查找与该合作伙伴的活动聊天会话。如果没有活动会话,我创建了一个新的聊天并将新的键/值对添加到注册表中。

于 2010-11-09T13:15:37.563 回答
0

只是有点困惑。你说

上面的代码是 smack 示例,但我的代码完全一样,只是我没有创建 PacketListener 内联实现。

在没有 PacketListener 实现的情况下如何接收消息?由于下面的代码,我认为您总是会收到来自您开始的聊天的消息

聊天 newChat = chatmanager.createChat("jsmith@jivesoftware.com", new MessageListener() { public void processMessage(Chat chat, Message message) { System.out.println("收到的消息:" + message); } });

但是为了异步等待传入的消息,我认为你需要一个 PacketListener。我可能完全误解了您面临的问题

(这应该是一个评论,但我不知道如何添加)

于 2010-11-11T03:00:39.097 回答
0

好久不见,你解决了吗?为什么要创建 FromContainsFilter?这样,您的侦听器仅处理来自给定用户的数据包,而不是所有数据包。

于 2011-07-29T17:12:31.313 回答