圖解Apache Mina

Apache MINA 是一個用於簡化開發構建高性能、高可擴展的網絡應用框架。經過JAVA NIO在各類傳輸協議(如:TCP/IP、UDP/IP)上提供抽象的事件驅動異步APIapache

Apache MINA能夠稱爲:NIO框架庫、服務端客戶端框架庫、一個網絡套接字庫網絡


 特性

  • 爲各類傳輸協議提供統一APIsession

  • 提供相似servlet filter的過濾鏈路支持數據結構

  • 可定製化線程模型架構

  • 開箱即用的 SSL · TLS · StartTLS框架

  • 超載保護和傳輸流量控制
  • 易於集成(如:與Spring集成)
  • 可平滑過渡到Netty
  • ...

(Apache MINA在應用中的角色)異步

從圖中能夠看出,只須要關注與MINA的交互而複雜的網絡層處理交由MINA來完成性能


 Apache MINA架構

 

(整體架構)spa

 採用三層架構:線程

  • 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 官網

說明

附件具標註各個類方法的具體實現,請注意查看

引用請註明出處

相關文章
相關標籤/搜索