
Smack3.4.1文档翻译:处理外部发来的数据包,Processing Incoming Packets
Smack提供 了一个灵活的框架来处理外部发来的数据包,具体来说 可采用两种结构:
•. org.jivesoftware.smack.PacketCollector -- 这个类,使得妳能够阻塞式地等待新数据包。
•. org.jivesoftware.smack.PacketListener -- 这个接口会在有数据包到来时异步地通知妳。
一个数据包监听器被用于事件风格 的编程, 而一个数据包收集器呢,拥有 一个 由数据包组成的 结果队列 , 妳可以 在该队列上做轮询 及阻塞式操作。所以,如果 妳想要在 有数据包 传 入时立即做出响应 的话,应当使用数据包监听器, 而如果妳想要等待特定数据包的到来的话则 可以使用一个数据包收集器。数据包收集 器和监听器可以使用一个Connection 实例来创建。
org.jivesoftware.smack.filter.PacketFilter 接口决定 了,哪些数据包会被传递给一个 PacketCollector 或 PacketListener 。 可以在 org.jivesoftware.smack.filter 包中找到狠多预定义的过滤器。
以下代码片段,演示了,同时注册一个数据包收集器和一个数据包监听器:
// 创建一个数据包过滤器,用来监听来自特定用户的新消息。
// 我们使用一个AndFilter来将另外两个过滤器组合在一起。
PacketFilter filter = new AndFilter(new PacketTypeFilter(Message.class),
new FromContainsFilter( "mary@jivesoftware.com" ));
// 假设我们已经创建了一个叫做"connection"的Connection。
// 首先,使用我们所创建的过滤器来注册一个数据包收集器。
PacketCollector myCollector = connection.createPacketCollector(filter);
// 一般情况下,妳会对该收集器做一些操作,例如等待新数据包。
// 接下来,创建一个数据包监听器。简短起见,我们使用了一个匿名内部类。
PacketListener myListener = new PacketListener() {
public void processPacket(Packet packet) {
// 针对 发来的数据包做一些操作。
}
};
// 注册该监听器。
connection.addPacketListener(myListener, filter);
标准数据包过滤 器
Smack 已经包含 了大量的数据包过滤器, 妳也可以通过 PacketFilter 接口来创建妳自己的过滤器。默认 的过滤器包括:
•. PacketTypeFilter -- 过滤那些具有特定 类(Class)类型的数据包。
•. PacketIDFilter -- 过滤具有特定数据包编号 的数据包。
•. ThreadFilter -- 过滤具有特定聊天序列编号 的消息数据包。
•. ToContainsFilter -- 过滤 那些 被发 往 特定地址的数据包。
•. FromContainsFilter -- 过滤那些 发自特定地址的数据包。
•. PacketExtensionFilter -- 过滤那些具有特定 的数据包扩展的数据包。
•. AndFilter -- 对两个过滤器进行逻辑与(AND)操作。
•. OrFilter -- 对两个过滤器进行逻辑或(OR)操作。
•. NotFilter -- 对某个过滤器进行逻辑非(NOT)操作。
李尚雅
HxLauncher: Launch Android applications by voice commands