一 接口PacketFilter的介绍
该接口定义了一种过滤packet对象的方法,对于一个packet结果集,只取具有指定属性的子集。该接口主要用于创建packet的监听器(listener)和收集器(collector),通过PacketFilter对监听器和收集器需要处理的packet进行过滤,让他们去处理指定的一部分packet。
Smack中已经预定义了一些基本的packet过滤器,也就是继承该接口的子类:AndFilter,FromContainsFilter,FromMatchesFilter, IQTypeFilter, MessageTypeFilter, NotFilter, OrFilter, PacketExtensionFilter, PacketIDFilter, PacketTypeFilter, ThreadFilter, ToContainsFilter。这些过滤器又可以通过AndFilter和OrFilter进行组合,从而构造一些更复杂的过滤器。通过实现该接口,用户还可以自定义过滤器。
二使用示例
下面的示例所创建的过滤器,就只保留指定ID的packet。其实现方法:使用匿名内部类定义一个PacketFilter,需要实现其accept方法,返回布尔值表示是否符合匹配条件,创建好的packetFilter接口可以被用于创建PacketCollector对象,有关PacketCollector对象的介绍,参见后文。
- // Use an anonymous inner class to define a packet filter that returns
- // all packets that have a packet ID of "RS145".
- PacketFilter myFilter = new PacketFilter() {
- public boolean accept(Packet packet) {
- return "RS145".equals(packet.getPacketID());
- }
- };
- // Create a new packet collector using the filter we created.
- PacketCollector myCollector = packetReader.createPacketCollector(myFilter);
// Use an anonymous inner class to define a packet filter that returns
// all packets that have a packet ID of "RS145".
PacketFilter myFilter = new PacketFilter() {
public boolean accept(Packet packet) {
return "RS145".equals(packet.getPacketID());
}
};
// Create a new packet collector using the filter we created.
PacketCollector myCollector = packetReader.createPacketCollector(myFilter);