我使用下面的代码发送消息。
// 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实现。
答案 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?这样,您的侦听器只处理来自给定用户的数据包,而不是所有数据包。