处理传入的数据

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 接口决定哪个特别的将会被传递到 PacketCollectorPacketListenerorg.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("[email protected]"));
// 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 ——实现一个过滤器的逻辑“非”操作。