smack 监听不同packet机制

之前做即时通讯,扒了smack源码来参考。说下其中解包后进行通知的机制。

Filter类:accept(Packet packet)函数,传入packet在此函数中进行对比判断,返回true
则通过此filter认证。实现PacketFilter接口即可。


public interface PacketFilter {

/**
* Tests whether or not the specified packet should pass the filter.
*
* @param packet the packet to test.
* @return true if and only if <tt>packet</tt> passes the filter.
*/
public boolean accept(Packet packet);
}

ListenerWrapper类:packetListener对应了自己在应用中定义的Listener(实现PacketListener接口),当通过对应的packetFilter之后,则进行回掉;


/**
* A wrapper class to associate a packet filter with a listener.
*/
protected static class ListenerWrapper {

private PacketListener packetListener;
private PacketFilter packetFilter;

/**
* Create a class which associates a packet filter with a listener.
*
* @param packetListener the packet listener.
* @param packetFilter the associated filter or null if it listen for all packets.
*/
public ListenerWrapper(PacketListener packetListener, PacketFilter packetFilter) {
this.packetListener = packetListener;
this.packetFilter = packetFilter;
}

/**
* Notify and process the packet listener if the filter matches the packet.
*
* @param packet the packet which was sent or received.
*/
public void notifyListener(Packet packet) {
if (packetFilter == null || packetFilter.accept(packet)) {
packetListener.processPacket(packet);
}
}
}


public interface PacketListener {

/**
* Process the next packet sent to this packet listener.<p>
*
* A single thread is responsible for invoking all listeners, so
* it‘s very important that implementations of this method not block
* for any extended period of time.
*
* @param packet the packet to process.
*/
public void processPacket(Packet packet);

}

接下来就是分包了,PacketReader中listenerExecutor.submit(new
ListenerNotification(packet));在ListenerNotification线程里面进行判断,关键代码如下,写在run里面


for (ListenerWrapper listenerWrapper : connection.recvListeners.values()) {
listenerWrapper.notifyListener(packet);
}

通过迭代出ListenerWrapper调用notifyListener函数,查找通过验证的filter然后相对应是哪个listener就进行通知。

smack 监听不同packet机制,布布扣,bubuko.com

时间: 2024-08-26 01:46:48

smack 监听不同packet机制的相关文章

Android基础入门教程——3.1 基于监听的事件处理机制

Android基础入门教程--3.1.1 基于监听的事件处理机制 标签(空格分隔): Android基础入门教程 本节引言: 第二章我们学习的是Android的UI控件,我们可以利用这些控件构成一个精美的界面,但是仅仅是界面而已:下一步就要开始学习逻辑与业务实现了,本章节讲解的是Android的事件处理机制!何为事件处理机制?举个 简单的例子,比如点击一个按钮,我们向服务器发送登陆请求!当然,Android中的事件处理机制不止这一种, 比如屏幕发生选择,我们点击了屏幕上某个区域-简单点说,事件处

Android的事件处理机制详解(二)-----基于监听的事件处理机制

基于监听的事件处理机制 前言: 我们开发的app更多的时候是需要与用户的交互----即对用户的操作进行响应 这就涉及到了android的事件处理机制; android给我们提供了两套功能强大的处理机制: ①基于监听的事件处理机制 ②基于回调的事件处理机制 在这一节中,我们会先介绍一下基于监听的事件处理机制 好了,废话不多说! 我们要先了解一下监听处理机制的模型 监听的处理模型: 处理模型图: 文字表述: 事件监听机制中由事件源,事件,事件监听器三类对象组成 处理流程: step 1:为某个事件源

Android_基于监听的事件处理机制

一.引言 在经过几天的学习之后, 首先熟悉了几大基本布局以及一些常用控件的使用方法,目前正在学习如何实现一个基本的登录注册界面及其功能,而实现功能就需要我们采用事件处理机制来进行调用事件处理方法.以下,就是我总结的一些事件处理机制. 二.常用监听接口 View.OnClickListener  单击事件监听器必须实现的接口 View.OnCreateContextMenuListener  创建上下文菜单事件 View.OnFocusChangeListener  焦点改变事件 View.OnK

基于监听的事件处理机制

事件监听机制是一种委派式的事件处理机制,事件源(组件)事件处理委托给事件监听器 当事件源发生指定事件时,就通知指定事件监听器,执行相应的操作 五种不同的使用形式: 匿名内部类: 平时最常用的一种:直接setXxxListener后,重写里面的方法即可; 通常是临时使用一次,复用性不高! btnshow.setOnClickListener(new OnClickListener() { //重写点击事件的处理方法onClick() @Override public void onClick(Vi

基于CSS class的事件监听管理机制 (转)

背景: 做了那么多web项目,总会发现到处都是事件绑定,同一个按钮的执行动作,也许会分布在多个js文件中. 而且对于js动态生成的文档片段,里面会经常出现“onclick=...”之类的代码,一到功能升级,或者代码重构的时候, 就会发现,这个难度以及工作量,和重写一遍没什么区别,有时候甚至工作量更大! 基于各种情况的分析.以及以往的经验总结,百度空间则有了一套自己的事件监听管理机制:基于CSS class的事件监听管理机制 方案: 1.js代码中,不出现对某节点的事件监听,如:$('#elm')

Android基础入门教程——3.5 监听EditText的内容变化

Android基础入门教程--3.5 监听EditText的内容变化 标签(空格分隔): Android基础入门教程 本节引言: 在前面我们已经学过EditText控件了,本节来说下如何监听输入框的内容变化! 这个再实际开发中非常实用,另外,附带着说下如何实现EditText的密码可见 与不可见!好了,开始本节内容! 1.监听EditText的内容变化 由题可知,是基于监听的事件处理机制,好像前面的点击事件是OnClickListener,文本内容 变化的监听器则是:TextWatcher,我们

Java中的事件监听机制

鼠标事件监听机制的三个方面: 1.事件源对象: 事件源对象就是能够产生动作的对象.在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象.Java中根据事件的动作来区分不同的事件源对象,动作发生在哪个组件上,那么该组件就是事件源对象 2.事件监听方法: addMouseListener(MouseListener ml) ;该方法主要用来捕获鼠标的释放,按下,点击,进入和离开的动作:捕获到相应的动作后,交由事件处理类(实现MouseListener接口)进行处理. addAction

.NET事件监听机制的局限与扩展

.NET中把“事件”看作一个基本的编程概念,并提供了非常优美的语法支持,对比如下C#和Java代码可以看出两种语言设计思想之间的差异. // C#someButton.Click += OnSomeButtonClick; // JavasomeButton.addActionListener( new ActionListener(){ public void actionPerformed(){ ... } }); 在我们的软件中就大量使用事件来对监听者与发布者解耦,但也遇到了一些局限,在这

事件监听:诀别Android繁琐的事件注册机制——view.setOnXXXXListener 滚犊子

好久没写过随笔了......windows phone生态没起来,属于.net阵营的我最近工作不是太忙,闲暇之余就心血来潮开始研究安卓.先简单扯两句这几天学习下来对java事件监听机制的一点感触.客观地讲,java的事件监听机制相比.net好原始,暂不说委托.lamda.泛型等的繁琐,仅一个事件监听,就需要各种listener才能实现,比如安卓里到处都是view.setOnXXXXListener.被C#“语法糖”和宇宙第一IDE惯坏的我真心有点不习惯,于是就决定写个工具来封装这些烦人的list