MINA 学习笔记

一、MINA简介

      Apache MINA(Multipurpose Infrastructure for Network Applications)是Apache组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的MINA版本支持基于Java NIO技术的TCP/UDP应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA  所支持的功能也在进一步的扩展中。
      目前正在使用MINA的软件包括有:Apache Directory Project,AMQP( Advanced Message Queuing Protocol),RED5 Server(Macromedia Flash Media RTMP),ObjectRADIUS,Openfire等等。
      Apache直属MINA的子项目有:FTPServer,AsyncWeb,SSHD。

二、MINA的用途

      MINA暂时分为1.x和2.x两个主版本。两版本之间的主要区别在于1.x使用传统IO方式,而2.x使用NIO。
      NIO比传统IO的优势在于NIO是无阻塞的,而传统IO是阻塞的,所以2.x版本性能会有所提高。
      由于NIO比传统IO更加难于理解,实现更加复杂,如果想自己开发一个基于NIO的高性能服务器会有所难度,并且会承担一定得风险。所以这也是为什么我们会使用MINA框架的原因,利用她我们可以简单的,快速的开发一个高并发,高稳定的服务器。
      MINA封装复杂的NIO实现,利用抽象的事件驱动的异步API来支持客户的开发,这也是为什么利用MINA可以进行快速开的原因之一。


      Apache MINA也称为:
      • NIO 框架库
      • 客户端、服务器框架库
      • 一个网络套接字库


      2.x 版本支持如下:
      • 为不同的传输类型提供了统一的API
      • 通过Java NIO提供TCP/IP和UDP/IP支持
      • 通过RXTX提供串口通讯(RS232)
      • In-VM管道通讯
      • 过滤器作为一个扩展特性
      • 高度定制化线程模型
      • 使用Java 5 SSL引擎提供沙盒(Out-of-the-box)SSL·TLS·StartTLS 支持
      • 超载保护和传输流量控制
      • JMX管理能力

三、环境准备


      • MINA开发需要的jar包,到官方网站http://mina.apache.org/downloads.html 下载
      • MINA的依赖包slf4j。请到http://www.slf4j.org/download.html 下载 slf4j包,slf4j项目解压后有很多的文件,我们只需要其中的 slf4j-ap和 slf4j-simple这两个jar文件。具体版本需要配置下载的MINA版本。
      • JDK,最低为1.5版本。
      • Java开发环境例如Eclipse、MyEclipse或者NetBeans。

四、MINA基本类的描述

      • IoService:应用程序入口。IoService负责底层通讯接入,IoAcceptor(服务器端)和IoConnector(客户端)是IoService的扩展接口。
      • IoAcceptor:相当于网络应用程序中的服务器端。IoAcceptor()可以同时启动多个端口,每个端口可以指定不同的handler 和filter,但是一个服务端只有一个监听器。
      • IoConnector:相当于客户端
      • IoSession:当前客户端到服务器端的一个连接实例
      • IoHandler:业务处理逻辑。该接口有五个实现类ChainedIoHandler, DemuxingIoHandler, IoHandlerAdapter, SingleSessionIoHandlerDelegate, StreamIoHandler。其中ChainedIoHandler, DemuxingIoHandler, StreamIoHandler实现了接口,并继承了IoHandlerAdapter,IoHandlerAdapter实现了接口的所有方法,但是在方法中并没有做什么,我们可以继承它,根据需要有选择的重写其中的方法。
      • IoFilter:过滤器用于悬接通讯层接口与业务层接口。IoFilter是MINA核心构造之一,扮演非常重要的角色。它过滤所有的I/O事件和请求,这些事件和请求由IoService最终到达IoHandler。

        过滤器的生命周期:一个过滤器只有当它处于过滤器链中时才会起过滤作用。

        当添加一个过滤器到过滤器链时:
              Sep1.ReferenceCountingIoFilter在第一时间调用init()方法。
              Sep2.调用onPreAdd方法来告知程序,一个过滤器将被添加到过滤器链中。
              Sep3.当过滤器被添加到过滤器链后,所有的事件和I/O请求都会通过过滤器到达IoHandler。
              Sep4.调用onPostAdd方法来告知程序,一个过滤器已被添加到过滤器链中。
              Sep5.当onPostAdd方法 抛出异常时,过滤器将会从过滤器链中被删除,如果这个过滤器是整个过滤器链中的最后一个,那么ReferenceCountingIoFilter将会调用destory()销毁该过滤器。

       当从过滤器链中移除过滤器时:
             Sep1.调用onPreRemove方法来告知程序,一个过滤器将会从过滤器链中被移除。
             Sep2.过滤器从过滤器链中被移除后后,所有的事件和I/O请求都不会通过该过滤器到达IoHandler。
             Sep3.调用onPostRemove方法来告知程序,一个过滤器已经从过滤器链中被移除。
             Sep4.当这个过滤器是过滤器链中的最后一个过滤器时,那么ReferenceCountingIoFilter将会调用destory()销毁该过滤器。


      • IoServiceListener监听器。IoServiceListener监听器的作用是监听其对应的IoService(IoAcceptor和IoConnector)中的事件。

五、MINA开发的一般步骤

    1.Server端:

    Sep1.创建接收器(IoAcceptor)

IoAcceptor acceptor = new SocketAcceptor();//建立基于socket通信的

    Sep2.Server的属性设置

SocketAcceptorConfig cfg = new SocketAcceptorConfig();
cfg.setReuseAddress(true);
// 启用SO_REUSEADDR 套接字选项(作用:允许不同server socket可以监听同一个端口)
cfg.getFilterChain().addLast("codec",
new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );
//获取过滤器链,并将指定的过滤器添加到过滤器链的最后位置。
cfg.getFilterChain().addLast( "logger", new LoggingFilter() );
//获取过滤器链,并将日志过滤器添加到过滤器链的最后位置。

    Sep3.绑定地址(address)和业务处理器(handler)到server。

acceptor.bind(new InetSocketAddress( SERVER_PORT ),
new ServerSessionHandler( ), cfg );
 // 绑定address和handler, SERVER_PORT为端口号。

    2.Client端

    Sep1.创建连接器(IoConnector)

SocketConnector connector=new SocketConnector();//创建一个基于Socket通信的链接器

    Sep2.Client端的属性设置

   

//创建连接器设置
SocketConnectorConfig cfg=new SocketConnectorConfig();
//设置连接超时时间
cfg.setConnectTimeout(CONNECT_TIMEOUT);
//添加过滤器链
cfg.getFilterChain().addLast("myChin", new ProtocolCodecFilter(new
TextLineCodecFactory()));

    Sep3.绑定地址(address)和业务处理器(handler)到客户端

   

//建立链接
connector.connect(new InetSocketAddress(HOSTNAME,PORT),new MinaClientSessionHandler(),cfg);


 

    3.编写业务处理类

      在业务处理类中不需要去关心实际的通讯细节,只管处理客户端传输过来的信息即可。为了简化 Handler 类,MINA 提供了 IoHandlerAdapter 类,此类仅仅是实现了 IoHandler 接口,但并不做任何处理。

猜你喜欢

转载自aeritheve.iteye.com/blog/1707365