Smack收到第一封邮件时出现问题

时间:2010-11-09 13:00:44

标签: java xmpp smack

我使用下面的代码发送消息。

 // 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的消息不会发生。

然后我收到它正确发送的消息。

请注意,我经常需要接收来自jabberIDs的消息,这些消息不在我的列表中,而且我的应用程序通常不是开始聊天的一方。

上面的代码是smack示例,但我的代码完全相同,除了我没有内联创建PacketListener实现。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

有点困惑。你说

  

上面的代码是smack示例,但我的代码完全相同,除了我没有内联创建PacketListener实现。

如果没有PacketListener实现,您如何收到消息?我认为,由于下面的代码,你总是会收到你开始聊天的消息

  

聊天newChat = chatmanager.createChat(“jsmith@jivesoftware.com”,新的MessageListener(){       public void processMessage(聊天聊天,消息消息){           System.out.println(“收到的消息:”+消息);       }   });

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

(这应该是一个评论,但我无法想出如何添加一个)

答案 3 :(得分:0)

已经有一段时间了,你有没有设法解决这个问题?你为什么要创建FromContainsFilter?这样,您的侦听器只处理来自给定用户的数据包,而不是所有数据包。