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

    说明

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

    引用请注明出处

  • 相关阅读:
    nodejs 访问mysql
    1.移动的矩形
    ubuntu 16.04 搜狗输入法无法中英文切换
    修改可选项文件实现自动连接数据库服务器
    Codeforces Round #374 (Div. 2)解题报告
    hihoCoder 1238 : Total Highway Distance(dfs + 二分)
    AIM Tech Round 3 (Div. 2) 题解
    Codeforces Round #367 (Div. 2) 题解
    图论模板集合
    poj1144Network (求割点模板题)
  • 原文地址:https://www.cnblogs.com/imaikce/p/11805402.html
Copyright © 2011-2022 走看看