Mina 快速入門

Mina是什麼

         Mina是一個基於NIO的網絡框架,使用它編寫程序時,可以專注於業務處理,而不用過於關心IO操作。不論應用程序採用什麼協議(TCP、UDP)或者其它的,Mina提供了一套公用的接口,來支持這些協議。目前可以處理的協議有:HTTP, XML, TCP, LDAP, DHCP, NTP, DNS, XMPP, SSH, FTP... 。從這一點來說,Mina不僅僅是一個基於NIO的框架,更是一個網絡層協議的實現。

  

MINA 設計架構

  

1、Mina 整體架構

 

開發程序時,只需要在Mina的基礎上,使用Mina的API就可以了。

 

2、Mina各個組件

 

在使用Mina時,可以在Server端使用,也可以在Client端使用。並且它們都使用了同樣的架構。

 

 

上面這個圖說明了Mina的處理大致流程。從這個圖上也可以看出,大致包括了3個部分:

·IoService:執行實際的IO操作。

·IoFilter Chain:將數據進行過濾或者轉換爲期望的數據結構,反之亦然。

·IoHandler:實際的業務操作。

  

所以如果想要使用Mina編寫程序,只需要下列3步即可:

·創建IoService。

·添加IoFilter到FilterChain

·編寫處理業務邏輯的IoHandler

  

3、server端示例

 定義一個IOHandler:

複製代碼
package com.fjn.frame.mina.timetest;

import java.util.Date;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

public class TimeServerHandler extends IoHandlerAdapter {
    @Override
    public void exceptionCaught(IoSession session, Throwable cause)
            throws Exception {
        cause.printStackTrace();
    }

    @SuppressWarnings("deprecation")
    @Override
    public void messageReceived(IoSession session, Object message)
            throws Exception {
        String str = message.toString();
        if (str.trim().equalsIgnoreCase("quit")) {
            session.close();
            return;
        }

        Date date = new Date();
        session.write(date.toString());
        System.out.println("Message written...");
    }

    @Override
    public void sessionIdle(IoSession session, IdleStatus status)
            throws Exception {
        System.out.println("IDLE " + session.getIdleCount(status));
    }
}
複製代碼

 

接下來就是使用Mina了: 

複製代碼
package com.fjn.frame.mina.timetest;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class MinaTimeServer {
    private static final int PORT = 9123;

    public static void main(String[] args) throws IOException {
        // 創建IoService
        IoAcceptor acceptor = new NioSocketAcceptor();
        // 添加Filter:
        acceptor.getFilterChain().addLast("logger", new LoggingFilter());
        acceptor.getFilterChain().addLast(
                "codec",
                new ProtocolCodecFilter(new TextLineCodecFactory(Charset
                        .forName("UTF-8"))));
        // 設置Handler
        acceptor.setHandler(new TimeServerHandler());
        // 其它配置
        acceptor.getSessionConfig().setReadBufferSize(2048);
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
        
        // 啓動服務
        acceptor.bind(new InetSocketAddress(PORT));
    }
}
複製代碼

 

運行上面程序後,可以在cmd(或者使用終端)上使用下面命令測試。

telnet 127.0.0.1 9123

  

4、IoService說明

         編寫網絡程序,一般都分爲Server/Clinet。Mina爲Server端程序提供的IoService實現是IoAcceptor,爲客戶端提供的實現是IoConnector。

Server端實現:

 

 

Clint端實現:

 

 

  

5、IoSession說明

Session,這個詞都不陌生。在Web開發中有Session的概念,在Hibernate中有Session的概念。Session就是對連接會話的封裝,存儲一些狀態信息。同樣在Mina中也有Session的概念。

在Mina會爲每一個連接創建session,並存儲在內存中,直到與Client之間連接斷開。

UDP協議是無連接的,這樣成立嗎?在Java NIO的API中有DatagramChannel、SocketChannel。所以Mina的NioSession中,就將封裝了Channel。

 

 

6、IoFilter說明

 

過濾器的作用,以及它的運行原理,開發過Web應用程序的人應該都是知道的。IoFilter的原理與Web應用中的Filter是一樣的,這裏就不在贅述。

 如果不清楚Filter的原理,可以參考這裏

使用過濾器可以做哪些事情呢?

1、  日誌記錄

2、  根據協議對數據進行編碼、解碼。

3、  SSL處理

等等。

 

上面示例中的TextLine協議過濾器,就是將用戶請求數據解碼成一行一行的數據。

 

目前已有過濾器有:

 

 

當然了,也可自定義Filter了。

 

 

7、IoHandler說明

 

IoHandler是在最後一個Filter中調用的。主要實現的方法是messageReceived。

就是寫你接收到數據後要處理的業務邏輯。例如示例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章