zoukankan      html  css  js  c++  java
  • MINA学习汇总

    MINA学习汇总

    Apache Mina Server 是一个网络通信应用框架,用于开发高性能和高可用性的网络应用程序。它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 提供了事件驱动、异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。

    Apache Mina简单理解它是一个封装底层IO操作,提供高级操作API的通讯框架!

    Mina在整个网通通信结构中位置:

     

    Mina处于中间层,它不关心底层网络数据如何传输,只负责接收底层数据,过滤并转换为Java对象提供给我们的应用程序,然后把应用程序响应值过滤并转换为底层识别的字节,提供给底层传输;

    ------总之:Mina是底层数据传输和用户应用程序交互的接口!

    Mina工作流程图如下:

     

     

    这个流程图不仅很直观的看出了Mina的工作流程,也涵盖了Mina的三个核心接口:IoService接口,IoFilter接口和IoHandler接口:

    l  第一步. 创建服务对象(客户端或服务端)  ---IoService接口实现

    l  第二步. 数据过滤(编码解码等)          ---IOFilter接口实现

    l  第三步. 业务处理                        ---IoHandler接口实现

    IoAccepter 相当于网络应用程序中的服务器端

    IoConnector 相当于客户端

    IoSession 当前客户端到服务器端的一个连接实例

    IoHandler 业务处理逻辑

    IoFilter 过滤器用于悬接通讯层接口与业务层接口

       Mina的精髓是IOFilter,它可以进行日志记录,信息过滤,编码解码等操作,把数据接收发送从业务层独立出来。

       创建服务对象,则是把NIO繁琐的部分进行封装,提供简洁的接口。

       业务处理是我们最关心的部分,跟普通的应用程序没任何分别。

    1.IoService接口

    作用:IoService是创建服务的顶层接口,无论客户端还是服务端,都是从它继承实现的。

    类结构

    常用接口为:IoService,IoAcceptor,IoConnector

    常用类为:NioSocketAcceptor,NioSocketConnector

    类图如下:

     

    IoService是创建服务端和客户端的接口,实际应用中我们大多都是应用它的实现类来创建服务对象

    2.IoFilter接口

    Mina最主要的工作就是把底层传输的字节码转换为Java对象,提供给应用程序;或者把应用程序返回的结果转换为字节码,交给底层传输。这些都是由IoFilter完成的,因此IoFilter是Mina的精髓所在。

    在Mina程序中,IoFilter是必不可少的;有了它,Mina的层次结构才异常清晰:

    IoFilter   ----   消息过滤

    IoHandler  ----   业务处理

        Filter,过滤器的意思。IoFilter,I/O操作的过滤器。IoFilter和Servlet中的过滤器一样,主要用于拦截和过滤网络传输中I/O操作的各种消息

    类结构

    常用接口为:IoFilter,IoFilterChainBuilder

    常用类为:IoFilterAdapter,DefaultIoFilterChainBuilder

    ProtocolCodecFilter,LoggingFilter

    类图如下:

    可以在IoService中添加多个IoFilter

    eg:

                // 创建一个非阻塞的server端的Socket

                acceptor = new NioSocketAcceptor();

                // 设置日志过滤器

                acceptor.getFilterChain().addLast("logger",new LoggingFilter());

                // 设置过滤器(使用Mina提供的文本换行符编解码器)

                acceptor.getFilterChain().addLast(

                        "codec",

                        new ProtocolCodecFilter(new TextLineCodecFactory(Charset

                                .forName("UTF-8"),

                                LineDelimiter.WINDOWS.getValue(),

                                LineDelimiter.WINDOWS.getValue())));

                // 获得IoSessionConfig对象

                IoSessionConfig cfg = acceptor.getSessionConfig();

                // 读写通道10秒内无操作进入空闲状态

                cfg.setIdleTime(IdleStatus.BOTH_IDLE, 10);

                // 绑定逻辑处理器

                acceptor.setHandler(new Demo1ServerHandler());

                // 绑定端口

                acceptor.bind(new InetSocketAddress(PORT));

                logger.info("服务端启动成功...     端口号为:" + PORT);

     

     

        IoFilter是转码和解码用滴。在实际的应用开发中,自定义协议是必用的,因为很多客户端和服务端是不同语言实现的。

     

    3.IoHandler接口

        IoHandler是Mina实现其业务逻辑的顶级接口;它相当简单,你就理解它是根据事件触发的简单应用程序即可。

    在IoHandler中定义了7个方法,根据I/O事件来触发对应的方法:

    import java.io.IOException;

    public interface IoHandler {

        void sessionCreated(IoSession session) throws Exception;

        void sessionOpened(IoSession session) throws Exception;

        void sessionClosed(IoSession session) throws Exception;

        void sessionIdle(IoSession session, IdleStatus status) throws Exception;

        void exceptionCaught(IoSession session, Throwable cause) throws Exception;

        void messageReceived(IoSession session, Object message) throws Exception;

        void messageSent(IoSession session, Object message) throws Exception;

    }

    sessionCreated:当一个新的连接建立时,由I/O processor thread调用;

    sessionOpened:当连接打开是调用;

    messageReceived:当接收了一个消息时调用;

    messageSent:当一个消息被(IoSession#write)发送出去后调用;

    sessionIdle:当连接进入空闲状态时调用;

    sessionClosed:当连接关闭时调用;

    exceptionCaught:当实现IoHandler的类抛出异常时调用;

    一般情况下,我们最关心的只有messageReceived方法,接收消息并处理,然后调用IoSession的write方法发送出消息!(注意:这里接收到的消息都是Java对象,在IoFilter中所有二进制数据都被解码啦!)

        一般情况下很少有人实现IoHandler接口,而是继承它的一个实现类IoHandlerAdapter,这样不用覆盖它的7个方法,只需要根据具体需求覆盖其中的几个方法就可以!

    Iohandler的7个方法其实是根据session的4个状态值间变化来调用的:

    Connected会话被创建并使用;

    Idle会话在一段时间(可配置)内没有任何请求到达,进入空闲状态;

    Closing会话将被关闭(剩余message将被强制flush);

    Closed会话被关闭;

    状态转换图如下:

     

    Java NIO是相对于传统的IO操作而言的,因为提出了缓冲池等概念,使它的处理数据的效率大大提高;

    多线程是并发处理的明智选择;为减少系统开销,线程池是并发应用中是经常使用的技术;

    异步处理机制可以大大缩短每个请求的响应时间;

    Mina2中就大量使用了这三项技术,使得它成为优秀的网络应用框架。

    (Mina是Java NIO实现的应用框架,更倾向于短连接的服务。

    服务端程序或客户端程序创建过程:创建连接——>添加消息过滤器(编码解码等)——>添加业务处理)

    魔由心生,有万境纵横,无一道清静,无量寿佛!
  • 相关阅读:
    多线程协作wait、notify、notifyAll方法简介理解使用 多线程中篇(十四)
    深入解析ThreadLocal 详解、实现原理、使用场景方法以及内存泄漏防范 多线程中篇(十七)
    java线程通信与协作小结 多线程中篇(十六)
    sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇(十五)
    final 关键字与安全发布 多线程中篇(十三)
    java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)
    windows系统dokuwiki安装部署设置 xampp环境配置
    synchronized关键字简介 多线程中篇(十一)
    Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)
    java锁与监视器概念 为什么wait、notify、notifyAll定义在Object中 多线程中篇(九)
  • 原文地址:https://www.cnblogs.com/qihuan/p/3758542.html
Copyright © 2011-2022 走看看