StupidBeauty
Read times:912Posted at:Tue Mar 18 01:14:44 2014
- no title specified

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)操作。

李尚雅

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands