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 官网

    说明

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

    引用请注明出处

  • 相关阅读:
    Git忽略规则.gitignore梳理
    基于Spring + Spring MVC + Mybatis 高性能web构建
    Java语言主要特点有哪些?
    PHP,JAVA,NET 开发比较
    Linux系统SVN安装指导配置说明
    SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis)
    Java Service Wrapper简介与使用
    js 使用tsx文件 引入node_modules安装的包文件提示 未找到模块(默认已经安装此包文件)
    js 压缩图片
    配置 ts-loader 后 执行编译时报错 TS6142: Module './router' was resolved to 'C:GitHubWorkspacewebpackPluginDemosrc outer.tsx', but '--jsx' is not set.
  • 原文地址:https://www.cnblogs.com/imaikce/p/11805402.html
Copyright © 2011-2022 走看看