处理传入的数据
Smack提供灵活的框架来通过两种构造处理收到的packet
:
- org.jivesoftware.smack.PacketCollector —— 一个让您同步等待新packet的类。
- org.jivesoftware.smack.PacketListener —— 一个异步通知您引入的packet的接口。
packet监听器用于事件样式的编程,而packet收集器有一个可以做轮询和阻塞操作的packet的结果队列。 所以,当您想对一个有可能随时到来的packet采取一些操作时,使用packet监听器;而当您想等待一个特别的packet到来时,使用packet收集器。您可以使用XMPPConnection
实例创建packet收集器和监听器。
org.jivesoftware.smack.filter.PacketFilter
接口决定哪个特别的将会被传递到 PacketCollector
或 PacketListener
。org.jivesoftware.smack.filter
包中有许多预定义的过滤器。
下面的代码片段演示注册了一个packet收集器和一个packet 监听器:
// Create a packet filter to listen for new messages from a particular
// user. We use an AndFilter to combine two other filters._
StanzaFilter filter = new AndFilter(new StanzaTypeFilter(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);
标准Packet过滤器。
Smack包括丰富的packet
过滤器集,当然您可以通过实现PacketFilter
接口创建自己的过滤器。 默认的过滤器集包括:
- PacketTypeFilter ——特定类的packet过滤器。
- PacketIDFilter ——含有特定packet ID的packet过滤器。
- ThreadFilter ——含有特定线程ID的消息packet过滤器。
- ToContainsFilter ——发送到特定地址的packet过滤器。
- FromContainsFilter ——来自特定地址的packet过滤器。
- PacketExtensionFilter ——含有特定packet扩充的packet过滤器。
- AndFilter ——实现两个过滤器的逻辑“与”操作。
- OrFilter —— 实现两个过滤器的逻辑“或”操作。
- NotFilter ——实现一个过滤器的逻辑“非”操作。