(转)OpenFire源码学习之二:Mina基础知识
转:http://blog.csdn.net/huwenfeng_2011/article/details/43413009
Mina概述
Apache MINA(Multipurpose Infrastructure for NetworkApplications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 JavaNIO 技术的 TCP/UDP应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA所支持的功能也在进一步的扩展中。
Apache MINA 也称为:
● NIO 框架库
● 客户端服务器框架库
● 一个网络套接字库
MINA虽然简单但是仍然提供了全功能的网络应用程序框架:
● 为不同的传输类型提供了统一的API:
○ 通过javaNIO提供TCP/IP 和 UDP/IP支持
○ 通过RXTX提供串口通讯(RS232)
○ In-VM管道通讯
○ 你能实现你自己的API!
● 过滤器作为一个扩展特性; 类似Servlet过滤器
● 低级和高级的API:
○ 低级: 使用字节缓存(ByteBuffers)
○ 高级: 使用用户定义的消息对象(objects)和编码(codecs)
● 高度定制化线程模型:
○ 单线程
○ 一个线程池
○ 一个以上的线程池(也就是SEDA)
● 使用Java 5 SSL引擎提供沙盒(Out-of-the-box) SSL • TLS • StartTLS支持
● 超载保护和传输流量控制
● 利用模拟对象进行单元测试
● JMX管理能力
● 通过StreamIoHandler提供基于流的I/O支持
● 和知名的容器(例如PicoContainer、spring)集成
● 从Netty平滑的迁移到MINA, Netty是MINA的前辈。
总之:它是一个封装底层IO操作,提供高级操作API的通讯框架!
Mina是底层数据传输和用户应用程序交互的接口
Mina处于中间层,它不关心底层网络数据如何传输,只负责接收底层数据,过滤并转换为Java对象提供给我们的应用程序,然后把应用程序响应值过滤并转换为底层识别的字节,提供给底层传输;
工作流程
Mina的核心接口:
l IoService: 创建服务对象(客户端或服务端)
l IOFilter: 数据过滤(编码解码等)
l IoHandler: 业务处理
IoService接口
IoService是创建服务的顶层接口,无论客户端还是服务端,都是从它继承实现的。
常用接口为:IoService,IoAcceptor,IoConnector
常用类为:NioSocketAcceptor,NioSocketConnector
l IoService接口声明了服务端的共有属性和行为;
l IoAcceptor接口继承了IoService接口,并添加了服务端特有的接口属性及方法,比如bind()方法,成为典型的服务端接口;
l IoConnector接口同样继承了IoService接口,并添加了客户端特有的接口属性及方法,比如connect()方法,成为典型的客户端接口;
l AbstractIoService实现了IoService中管理服务的方法。如getFilterChainBuilder方法---获得过滤器链;
AbstractIoService抽象类继承了AbstractIoService抽象类并实现了 IoAcceptor 接口,成为了拥有管理服务端实现功能的服务端类;我们常用的 NioSocketAcceptor就是它的子类;
l AbstractIoConnector抽象类继承了AbstractIoService抽象类并实现了IoConnector接口,成为了拥有管理客户端实现功能的客户端类;我们常用的NioSocketConnector就是它的子类;
创建客户端和服务端
- IoAcceptor acceptor = null;
- // 创建一个非阻塞的server端的Socket
- acceptor = new NioSocketAcceptor();
- // 创建一个非阻塞的客户端程序
- IoConnector connector = new NioSocketConnector();
IoFilter接口
Mina最主要的工作就是把底层传输的字节码转换为Java对象,提供给应用程序;或者把应用程序返回的结果转换为字节码,交给底层传输。这些都是由IoFilter完成的,因此IoFilter是Mina的精髓所在。
IoFilter,I/O操作的过滤器。IoFilter和Servlet中的过滤器一样,主要用于拦截和过滤网络传输中I/O操作的各种消息。IoFilter的主要作用:
l 记录事件的日志(Mina默认提供了LoggingFilter)
l 测量系统性能
l 信息验证
l 过载控制
l 信息的转换(主要就是编码和解码)
类结构
常用接口为:IoFilter,IoFilterChainBuilder
常用类为:IoFilterAdapter,DefaultIoFilterChainBuilder
类图如下:
类分析:
IoFilterAdapter:
IoFilterAdapter是个抽象的适配器类,我们可以根据需要扩展这个类,并且有选择的覆盖过滤器的方法;所有方法的默认把事件转发到下一个过滤器;
- public void sessionOpened(NextFilter nextFilter, IoSession session)throws Exception {
- nextFilter.sessionOpened(session);
- }
ReferenceCountingFilter
它封装了IoFilter实例,监看调用该filter的对象的个数,如果没有任何对象调用该IoFilter,就自动销毁IoFilter它类似serlvet拥有doserveric、init、destroy。
- public class ReferenceCountingFilter implements IoFilter {
- private final IoFilter filter;
- private int count = 0;
- public ReferenceCountingFilter(IoFilter filter) {
- this.filter = filter;
- }
- public void init() throws Exception {
- // no-op, will init on-demand in pre-add if count == 0
- }
- public void destroy() throws Exception {
- .......
IoHandler接口
IoHandler是Mina实现其业务逻辑的顶级接口;在IoHandler中定义了7个方法,根据I/O事件来触发对应的方法:
方法名 |
说明 |
sessionCreated |
当一个新的连接建立时,由I/O processor thread调用; |
sessionOpened |
当连接打开是调用; |
messageReceived |
当接收了一个消息时调用; |
messageSent |
当一个消息被(IoSession#write)发送出去后调用; |
sessionIdle |
当连接进入空闲状态时调用; |
sessionClosed |
当连接关闭时调用 |
exceptionCaught |
当实现IoHandler的类抛出异常时调用; |
OF与Mina
在连接管理器中ConnectionManagerImpl 创建的监听器createClientListeners()方法就是用的mian框架去做联网处理,首先设置mina框架的线程池,然后把由XMPPCodecFactory做为 ProtocolCodecFilter的chain添加到FilterChain中!
- private void createClientListeners() {
- // Start clients plain socket unless it's been disabled.
- if (isClientListenerEnabled()) {
- // Create SocketAcceptor with correct number of processors
- socketAcceptor = buildSocketAcceptor();
- // Customize Executor that will be used by processors to process incoming stanzas
- ExecutorThreadModel threadModel = ExecutorThreadModel.getInstance("client");
- int eventThreads = JiveGlobals.getIntProperty("xmpp.client.processing.threads", 16);
- ThreadPoolExecutor eventExecutor = (ThreadPoolExecutor)threadModel.getExecutor();
- eventExecutor.setCorePoolSize(eventThreads + 1);
- eventExecutor.setMaximumPoolSize(eventThreads + 1);
- eventExecutor.setKeepAliveTime(60, TimeUnit.SECONDS);
- socketAcceptor.getDefaultConfig().setThreadModel(threadModel);
- // Add the XMPP codec filter
- socketAcceptor.getFilterChain().addFirst("xmpp", new ProtocolCodecFilter(new XMPPCodecFactory()));
- // Kill sessions whose outgoing queues keep growing and fail to send traffic
- socketAcceptor.getFilterChain().addAfter("xmpp", "outCap", new StalledSessionsFilter());
- }
- }
在启动监听的时候startClientListeners():
- 。。。。。。
- socketAcceptor.bind(new InetSocketAddress(bindInterface, port), new
- ClientConnectionHandler(serverName));
- 。。。。。。
ClientConnectionHandler是IoHandler的曾孙子
IoHandler->IoHandlerAdapter->ConnectionHandler->ClientConnectionHandler
IoHandler和IoHandlerAdapter两个类来自Mina。OF中ConnectionHandler继承于IoHandlerAdapter类。
关系类图:
当有客户端进行连接的时候MINA框架会调用IoHandler的sessionOpened()。
- public void sessionOpened(IoSession session) throws Exception {
- // 针对于新的连接创建xml解析器
- final XMLLightweightParser parser = new XMLLightweightParser(CHARSET);
- session.setAttribute(XML_PARSER, parser);
- // 创建 一个新的NIOConnection 会话连接
- final NIOConnection connection = createNIOConnection(session);
- session.setAttribute(CONNECTION, connection);
- session.setAttribute(HANDLER, createStanzaHandler(connection));
- final int idleTime = getMaxIdleTime() / 2;
- if (idleTime > 0) {
- session.setIdleTime(IdleStatus.READER_IDLE, idleTime);
- }
- }
而客户端有消息来的时候,则调用用IoHandler的messageReceived()来处理
(转)OpenFire源码学习之二:Mina基础知识的更多相关文章
- (转)OpenFire源码学习之一:XMPP基础知识
转:http://blog.csdn.net/huwenfeng_2011/article/details/43412919 前面两张主要讲基础部分.XMPP与Mina有部分抄写于互联网的其他大事 X ...
- (转)OpenFire源码学习之二十七:Smack源码解析
转:http://blog.csdn.net/huwenfeng_2011/article/details/43484199 Smack Smack是一个用于和XMPP服务器通信的类库,由此可以实现即 ...
- Spring Ioc源码分析系列--Ioc的基础知识准备
Spring Ioc源码分析系列--Ioc的基础知识准备 本系列文章代码基于Spring Framework 5.2.x Ioc的概念 在Spring里,Ioc的定义为The IoC Containe ...
- (转)OpenFire源码学习之十:连接管理(上)
转:http://blog.csdn.net/huwenfeng_2011/article/details/43415827 关于连接管理分为上下两部分 连接管理 在大并发环境下,连接资源 需要随着用 ...
- (转)OpenFire源码学习之七:组(用户群)与花名册(用户好友)
转:http://blog.csdn.net/huwenfeng_2011/article/details/43413651 Group 在openfire中的gorop——组,也可以理解为共享组.什 ...
- java源码学习(二)Integer
Integer类包含了一个原始基本类型int.Integer属性中就一个属性,它的类型就是int. 此外,这个类还提供了几个把int转成String和把String转成int的方法,同样也提供了其它跟 ...
- (转)OpenFire源码学习之十八:IOS离线推送
转:http://blog.csdn.net/huwenfeng_2011/article/details/43458213 IOS离线推送 场景: 如果您有iOS端的APP,在会话聊天的时候,用户登 ...
- (转)OpenFire源码学习之六:用户注册
转:http://blog.csdn.net/huwenfeng_2011/article/details/43413509 用户注册 注册流程: 1.客户端进行握手给服务端发送连接消息: <s ...
- (转)OpenFire源码学习之四:openfire的启动流程
转:http://blog.csdn.net/huwenfeng_2011/article/details/43413233 openfire启动 ServerStarter 启动流程图: 启动的总入 ...
随机推荐
- js、jQuery实现文字上下无缝轮播、滚动效果
因项目需要实现消息通知上下无缝轮播的效果,所以写了一下,在这个分享出来,希望再次遇到此需求的道友,可以直接拷贝来用,节约一点不必要的时间. 原生JS版本 <!DOCTYPE html> & ...
- 原来... 用debug如何查看当前标志寄存器的标志位值?
-r 用这个指令,得到的信息右下角: NV UP EI PL NZ NA PO NC这些符号代表的就是标志寄存器里常用标志位的值. 这个是符号值对应表: 溢出标志OF(Ov ...
- HTML-参考手册: HTML 拾色器
ylbtech-HTML-参考手册: HTML 拾色器 1.返回顶部 1. HTML 拾色器 选取颜色: 或输入颜色值: OK 或使用 HTML5: 选择的颜色: 黑色文本 阴影 白色文本 阴 ...
- 三、函数 (SUM、MIN、MAX、COUNT、AVG)
第八章 使用数据处理函数 8.1 函数 SQL支持利用函数来处理数据.函数一般是在数据上执行的,给数据的转换和处理提供了方便. 每一个DBMS都有特定的函数.只有少数几个函数被所有主要的DBMS等同的 ...
- spark优化——依赖包传入HDFS_spark.yarn.jar和spark.yarn.archive的使用
一.参数说明 启动Spark任务时,在没有配置spark.yarn.archive或者spark.yarn.jars时, 会看到不停地上传jar,非常耗时:使用spark.yarn.archive可以 ...
- zookeeper和dubbo可视化软件的使用
1. zookeeper的可视化软件使用 Zkui 1. 下载软件 https://github.com/DeemOpen/zkui.git 2. 解压编译 clean install 会在targ ...
- 深信服杯ctf部分wp
CRYPTO1,NO SOS题目给了一段由.和-构成的密码由于题目提示不是摩斯码,将.和-化为0和1,长度为65位无法与8或7整除,无法转换为ascii,但可以被5整除,猜测为培根密码,将0化为a,1 ...
- HTML + CSS (下)【更新中】
弹性盒子: 定义:弹性盒子模型是css3中新提出的一种布局方案.是一种为了应对针对不同屏幕宽度不同设备的一整套新的布局方案. 主要是对一个容器中的子元素进行排列.对齐和分配空白空间的方案的调整. 新旧 ...
- linux常用命令-1系统相关命令
hostname #计算机名 passwd #修改密码 reboot #重启 shutdown –r now #立刻重启(root用户使用) shutdown –r 10 #过10分钟自动重启(roo ...
- 让所有Excel数据格全部乘 某个数
1 首先设置单元格格式要是数字 2 然后在随便一个单元格写入你要乘的数字 3 粘贴的时候设置选择性粘贴,然后设置乘就OK