http://www.igniterealtime.org/builds/smack/docs/latest/documentation/processing.html
Processing Incoming Packets
수신되는 패킷을 처리하는데 두가지 방식을 지원한다.
- org.jivesoftware.smack.PacketCollector -- 새로운 패킷이 올때까지 동기적으로 대기하는 클래스
- org.jivesoftware.smack.PacketListener -- 수신되는 패킷을 비동기적으로 받는 인터페이스
패킷리스너는 이벤트스타일의 프로그래밍이다. 반면에 패킷콜렉터는 당신이 폴링으로 수집한 데이터를 큐잉하여 받게되며 그 동작은 블럭된다. 패킷리스너는 수신중에 언제든지 다른 작업이 가능하며 콜렉터는 원하는 패킷이 올때가지 대기할때 유용하다. 이 두가지는 모두 XMPPConnection의 인스턴스로부터 얻을수 있다.
org.jivesoftware.smack.filter.PacketFilter인터페이스는 패킷리스너와 패킷콜렉터가 전달받을킷을러주는 역할을 한다. org.jivesoftware.smack.filter패키지에 미리정의된 많은 사용가능한 필터들이 정의되어 있다.
아래 코드는 패킷리스너와 패킷콜렉터를 모두 사용하는 데모이다.
// Create a packet filter to listen for new messages from a particular// user. We use an AndFilter to combine two other filters. PacketFilter filter = new AndFilter(new PacketTypeFilter(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); |
Standard Packet Filters
아래는 Smack에서 제공하는 패킷필터들의 셋이다. PacketFilter인터페이스로 새로운 필터를 정의할수도 있다. 디폴트셋은 아래와 같다.
- PacketTypeFilter -- 클래스타입을 지정할 수 있다.
- PacketIDFilter -- 패킷 ID별로 지정할 수 있다.
- ThreadFilter -- 메세지패킷의 스레드 ID별로 지정할 수 있다.
- ToContainsFilter -- 받는 주소로 지정할 수 있다.
- FromContainsFilter -- 보내는 주소로 지정할 수 있다.
- PacketExtensionFilter -- 패킷의 확장부분을 지정할 수 있다.
- AndFilter -- 논리적 AND 연산을 두개이상의 필터로 지정할 수 있도록 해준다.
- OrFilter -- 논리적 OR 연산을 두개이상의 필터로 지정할 수 있도록 해준다.
- NotFilter -- 논리적 NOT 연산을 두개이상의 필터로 지정할 수 있도록 해준다.