天天看點

Mina學習筆記之一:初識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

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

2、Mina各個元件

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

Mina學習筆記之一:初識Mina

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

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

·IoFilter Chain:将資料進行過濾或者轉換為期望的資料結構,反之亦然。

·IoHandler:實際的業務操作。

是以如果想要使用Mina編寫程式,隻需要下列3步即可:

·建立IoService。

·添加IoFilter到FilterChain

·編寫處理業務邏輯的IoHandler

3、server端示例

package com.zgk.mina.server;

import java.net.SocketAddress;
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();
    }

 
    @Override
    public void messageReceived(IoSession session, Object message)
            throws Exception {
        String str = message.toString();
        SocketAddress remoteAddress = session.getRemoteAddress();
       
        System.out.println("伺服器接收到資料:"+str+"------用戶端位址為:"+remoteAddress.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));
    }
}           
package com.zgk.mina.server;

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));
        System.out.println("MinaTimeServer已啟動,監聽端口:"+PORT);
    }
}

           
測試結果:           
Mina學習筆記之一:初識Mina
Mina學習筆記之一:初識Mina

4、IoService說明

         編寫網絡程式,一般都分為Server/Clinet。Mina為Server端程式提供的IoService實作是IoAcceptor,為用戶端提供的實作是IoConnector。

Server端實作:

Mina學習筆記之一:初識Mina

Clint端實作:

Mina學習筆記之一:初識Mina

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協定過濾器,就是将使用者請求資料解碼成一行一行的資料。

目前已有過濾器有:

Mina學習筆記之一:初識Mina

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

7、IoHandler說明

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

就是寫你接收到資料後要處理的業務邏輯

繼續閱讀