zoukankan      html  css  js  c++  java
  • 图解Apache Mina

    Apache MINA 是一个用于简化开发构建高性能、高可扩展的网络应用框架。通过JAVA NIO在各种传输协议(如:TCP/IP、UDP/IP)上提供抽象的事件驱动异步API

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


     特性

    • 为各种传输协议提供统一API

    • 提供类似servlet filter的过滤链路支持

    • 可定制化线程模型

    • 开箱即用的 SSL · TLS · StartTLS

    • 超载保护和传输流量控制
    • 易于集成(如:与Spring集成)
    • 可平滑过渡到Netty
    • ...

    (Apache MINA在应用中的角色)

    从图中可以看出,只需要关注与MINA的交互而复杂的网络层处理交由MINA来完成


     Apache MINA架构

     

    (总体架构)

     采用三层架构:

    • I/O Service - 执行实际 I/O处理
    • I/O Filter Chain - 将字节过滤/转换为所需的数据结构,反之亦然
    • I/O Handler - 应用层实现逻辑的地方

    所以创建一个基于Apache MINA的应用只需要

    1. 创建an I/O service - 选择合适的Acceptor或自定义
    2. 创建 a Filter Chain - 转换请求响应
    3. 创建 an I/O Handler - 处理不同的消息

     (服务端架构)

     (服务端流程示意)

     (客户端架构)


     案例分析

    服务端

        public static void main(String[] args) throws IOException {
            //IoService
            final IoAcceptor acceptor = new NioSocketAcceptor();
            //IoFilter
            acceptor.getFilterChain().addLast("logger",new LoggingFilter());
            acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(
                    //ProtocolCodecFactory
                    new TextLineCodecFactory(Charset.forName("UTF-8"))));
            //IoHandler
            acceptor.setHandler(new TimeServerHandler());
            //IoService
            acceptor.getSessionConfig().setReadBufferSize(2048);
            acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10);
    
            acceptor.bind(new InetSocketAddress(PORT));
            LOGGER.info("服务端启动成功,端口:{}",PORT);
        }

     客户端

     public static void main(String[] args) throws InterruptedException {
            //IoConnector
            final NioSocketConnector connector = new NioSocketConnector();
            connector.setConnectTimeoutMillis(3*1000);
    //        connector.getSessionConfig().setUseReadOperation(true);
            //IoFilter
            connector.getFilterChain().addLast("codec",
                    new ProtocolCodecFilter(
    //      ProtocolCodecFactory
                            new ObjectSerializationCodecFactory()));
            connector.getFilterChain().addLast("logger",new LoggingFilter());
            //IoHandler
            connector.setHandler(new TcpClientHandler());
            IoSession session = null;
            for (;;){
                try {
                    //IoFuture
                    final ConnectFuture connectFuture = connector.connect(new InetSocketAddress(HOST, PORT));
                    connectFuture.awaitUninterruptibly();
                    session = connectFuture.getSession();
                    break;
                }catch (RuntimeIoException e){
                    System.err.println("failed connected");
                    e.printStackTrace();
                    Thread.sleep(5000);
                }
                session.getCloseFuture().awaitUninterruptibly();
                //IoProcessor
                connector.dispose();
            }
        }

    主要类图


     附件 

    图示具体分析

    参考

    Apache MINA 官网

    说明

    附件具标注各个类方法的具体实现,请注意查看

    引用请注明出处

  • 相关阅读:
    Oracle中有大量的sniped会话
    Error 1130: Host '127.0.0.1' is not allowed to connect to this MySQL server
    汉字转换为拼音以及缩写(javascript)
    高效率随机删除数据(不重复)
    vs2010 舒服背景 优雅字体 配置
    mvc中的ViewData用到webfrom中去
    jquery ajax return值 没有返回 的解决方法
    zShowBox (图片放大展示jquery版 兼容性好)
    动感效果的TAB选项卡 jquery 插件
    loading 加载提示······
  • 原文地址:https://www.cnblogs.com/imaikce/p/11805402.html
Copyright © 2011-2022 走看看