zoukankan      html  css  js  c++  java
  • (转)OpenFire源码学习之二:Mina基础知识

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43413009

    Mina概述

    Apache MINA(Multipurpose Infrastructure for NetworkApplications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA所支持的功能也在进一步的扩展中。

    Apache MINA 也称为:

      ● NIO 框架库

      ● 客户端服务器框架库

      ● 一个网络套接字库

    MINA虽然简单但是仍然提供了全功能的网络应用程序框架:

      ● 为不同的传输类型提供了统一的API:

      ○ 通过java NIO提供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就是它的子类;

    创建客户端和服务端

    [java] view plain copy
     
    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是个抽象的适配器类,我们可以根据需要扩展这个类,并且有选择的覆盖过滤器的方法;所有方法的默认把事件转发到下一个过滤器;

    [java] view plain copy
     
    1. public void sessionOpened(NextFilter nextFilter, IoSession session)throws Exception {  
    2.         nextFilter.sessionOpened(session);  
    3.   }  

    ReferenceCountingFilter 

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

    [java] view plain copy
     
    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中!

    [java] view plain copy
     
    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.   
    14.             socketAcceptor.getDefaultConfig().setThreadModel(threadModel);  
    15.             // Add the XMPP codec filter  
    16.             socketAcceptor.getFilterChain().addFirst("xmpp", new ProtocolCodecFilter(new XMPPCodecFactory()));  
    17.             // Kill sessions whose outgoing queues keep growing and fail to send traffic  
    18.             socketAcceptor.getFilterChain().addAfter("xmpp", "outCap", new StalledSessionsFilter());  
    19.         }  
    20.     }  

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

    [java] view plain copy
     
    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()。

    [java] view plain copy
     
    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()来处理

  • 相关阅读:
    130行C语言实现个用户态线程库(2)
    130行C语言实现个用户态线程库(1)
    用C语言模仿Python函数
    ES 2.4 bigdesk 安装失败解决方案.
    使用SqlBulkCopy, 插入整个DataTable中的所有数据到指定数据库中
    表A的数据减去表B ,最终得到表C
    关于把A表中的数据复制到B表中(整理)
    需求池整理
    app主流推广渠道
    流程图梳理
  • 原文地址:https://www.cnblogs.com/wangle1001986/p/7150791.html
Copyright © 2011-2022 走看看