转: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

IoService接口声明了服务端的共有属性和行为;

IoAcceptor接口继承了IoService接口,并添加了服务端特有的接口属性及方法,比如bind()方法,成为典型的服务端接口;

IoConnector接口同样继承了IoService接口,并添加了客户端特有的接口属性及方法,比如connect()方法,成为典型的客户端接口;

AbstractIoService实现了IoService中管理服务的方法。如getFilterChainBuilder方法---获得过滤器链;

    AbstractIoService抽象类继承了AbstractIoService抽象类并实现了   IoAcceptor  接口,成为了拥有管理服务端实现功能的服务端类;我们常用的  NioSocketAcceptor就是它的子类;

AbstractIoConnector抽象类继承了AbstractIoService抽象类并实现了IoConnector接口,成为了拥有管理客户端实现功能的客户端类;我们常用的NioSocketConnector就是它的子类;

创建客户端和服务端

  1. IoAcceptor acceptor = null;
  2. // 创建一个非阻塞的server端的Socket
  3. acceptor = new NioSocketAcceptor();
  4. // 创建一个非阻塞的客户端程序
  5. 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是个抽象的适配器类,我们可以根据需要扩展这个类,并且有选择的覆盖过滤器的方法;所有方法的默认把事件转发到下一个过滤器;

  1. public void sessionOpened(NextFilter nextFilter, IoSession session)throws Exception {
  2. nextFilter.sessionOpened(session);
  3. }

ReferenceCountingFilter

它封装了IoFilter实例,监看调用该filter的对象的个数,如果没有任何对象调用该IoFilter,就自动销毁IoFilter它类似serlvet拥有doserveric、init、destroy。

  1. public class ReferenceCountingFilter implements IoFilter {
  2. private final IoFilter filter;
  3. private int count = 0;
  4. public ReferenceCountingFilter(IoFilter filter) {
  5. this.filter = filter;
  6. }
  7. public void init() throws Exception {
  8. // no-op, will init on-demand in pre-add if count == 0
  9. }
  10. public void destroy() throws Exception {
  11. .......

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中!

  1. private void createClientListeners() {
  2. // Start clients plain socket unless it's been disabled.
  3. if (isClientListenerEnabled()) {
  4. // Create SocketAcceptor with correct number of processors
  5. socketAcceptor = buildSocketAcceptor();
  6. // Customize Executor that will be used by processors to process incoming stanzas
  7. ExecutorThreadModel threadModel = ExecutorThreadModel.getInstance("client");
  8. int eventThreads = JiveGlobals.getIntProperty("xmpp.client.processing.threads", 16);
  9. ThreadPoolExecutor eventExecutor = (ThreadPoolExecutor)threadModel.getExecutor();
  10. eventExecutor.setCorePoolSize(eventThreads + 1);
  11. eventExecutor.setMaximumPoolSize(eventThreads + 1);
  12. eventExecutor.setKeepAliveTime(60, TimeUnit.SECONDS);
  13. socketAcceptor.getDefaultConfig().setThreadModel(threadModel);
  14. // Add the XMPP codec filter
  15. socketAcceptor.getFilterChain().addFirst("xmpp", new ProtocolCodecFilter(new XMPPCodecFactory()));
  16. // Kill sessions whose outgoing queues keep growing and fail to send traffic
  17. socketAcceptor.getFilterChain().addAfter("xmpp", "outCap", new StalledSessionsFilter());
  18. }
  19. }

在启动监听的时候startClientListeners():

  1. 。。。。。。
  2. socketAcceptor.bind(new InetSocketAddress(bindInterface, port), new
  3. ClientConnectionHandler(serverName));
  4. 。。。。。。

ClientConnectionHandler是IoHandler的曾孙子

IoHandler->IoHandlerAdapter->ConnectionHandler->ClientConnectionHandler

IoHandler和IoHandlerAdapter两个类来自Mina。OF中ConnectionHandler继承于IoHandlerAdapter类。

关系类图:

当有客户端进行连接的时候MINA框架会调用IoHandler的sessionOpened()。

  1. public void sessionOpened(IoSession session) throws Exception {
  2. // 针对于新的连接创建xml解析器
  3. final XMLLightweightParser parser = new XMLLightweightParser(CHARSET);
  4. session.setAttribute(XML_PARSER, parser);
  5. // 创建 一个新的NIOConnection 会话连接
  6. final NIOConnection connection = createNIOConnection(session);
  7. session.setAttribute(CONNECTION, connection);
  8. session.setAttribute(HANDLER, createStanzaHandler(connection));
  9. final int idleTime = getMaxIdleTime() / 2;
  10. if (idleTime > 0) {
  11. session.setIdleTime(IdleStatus.READER_IDLE, idleTime);
  12. }
  13. }

而客户端有消息来的时候,则调用用IoHandler的messageReceived()来处理

(转)OpenFire源码学习之二:Mina基础知识的更多相关文章

  1. (转)OpenFire源码学习之一:XMPP基础知识

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43412919 前面两张主要讲基础部分.XMPP与Mina有部分抄写于互联网的其他大事 X ...

  2. (转)OpenFire源码学习之二十七:Smack源码解析

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43484199 Smack Smack是一个用于和XMPP服务器通信的类库,由此可以实现即 ...

  3. Spring Ioc源码分析系列--Ioc的基础知识准备

    Spring Ioc源码分析系列--Ioc的基础知识准备 本系列文章代码基于Spring Framework 5.2.x Ioc的概念 在Spring里,Ioc的定义为The IoC Containe ...

  4. (转)OpenFire源码学习之十:连接管理(上)

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43415827 关于连接管理分为上下两部分 连接管理 在大并发环境下,连接资源 需要随着用 ...

  5. (转)OpenFire源码学习之七:组(用户群)与花名册(用户好友)

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43413651 Group 在openfire中的gorop——组,也可以理解为共享组.什 ...

  6. java源码学习(二)Integer

    Integer类包含了一个原始基本类型int.Integer属性中就一个属性,它的类型就是int. 此外,这个类还提供了几个把int转成String和把String转成int的方法,同样也提供了其它跟 ...

  7. (转)OpenFire源码学习之十八:IOS离线推送

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43458213 IOS离线推送 场景: 如果您有iOS端的APP,在会话聊天的时候,用户登 ...

  8. (转)OpenFire源码学习之六:用户注册

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43413509 用户注册 注册流程: 1.客户端进行握手给服务端发送连接消息: <s ...

  9. (转)OpenFire源码学习之四:openfire的启动流程

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43413233 openfire启动 ServerStarter 启动流程图: 启动的总入 ...

随机推荐

  1. 洛谷 P1271 聚会的快乐(树状dp)

    题目描述 你要组织一个由你公司的人参加的聚会.你希望聚会非常愉快,尽可能多地找些有趣的热闹.但是劝你不要同时邀请某个人和他的上司,因为这可能带来争吵.给定N个人(姓名,他幽默的系数,以及他上司的名字) ...

  2. 【dart学习】-- Dart之异步编程

    一,概述 编程中的代码执行,通常分为同步与异步两种. 同步:简单说,同步就是按照代码的编写顺序,从上到下依次执行,这也是最简单的我们最常接触的一种形式.但是同步代码的缺点也显而易见,如果其中某一行或几 ...

  3. OC学习篇之---谓词(NSPredicate)

    在前一篇文章中我们介绍了OC中一个重要技术通知:http://blog.csdn.net/jiangwei0910410003/article/details/41923401,今天我们在来看一下OC ...

  4. zabbix监控winserver网卡流量

    当前基于windows2008系统安装配置zabbix客户端,服务端为linux系统 1.设置防火墙规则 开启防火墙入站(tcp和udp)10050端口 2.在zabbix官网上下载windows包 ...

  5. 如何把EXCEL数据导入到SQL SERVER数据库中 (转)

    转:http://blog.csdn.net/jjp837661103/article/details/13509889 在我们完成一个项目开发之后,通常我们需要把客户的很多数据导入到数据库中,面对大 ...

  6. CentOS 7 & php7.2安装 php-redis 扩展

    CentOS 7 & php7.2安装 php-redis 扩展 1.下载phpredis-developcd /tmpwget https://codeload.github.com/php ...

  7. 用 Flask 来写个轻博客 (12) — M(V)C_编写和继承 Jinja 模板

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 使用 Bootstrap 编写 Jinja 模板文件 继承一 ...

  8. JPA 唯一索引

    @Table(name = "adam_module", uniqueConstraints = @UniqueConstraint(columnNames = {"in ...

  9. 元类,sqlalchemy查询

    import sqlalchemy from sqlalchemy.ext.declarative import declarative_base #创建连接实例 db = sqlalchemy.cr ...

  10. 【外】001-python3之zip函数

    zip函数语法格式zip(可迭代对象1, 可迭代对象2, ... ,可迭代对象n) 函数接收任意个可迭代对象作为参数, 将所有对象中对应位置上的元素分别打包在一起组成一个tuple, 并将所有的tup ...