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端示例
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);
}
}
測試結果:
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。
就是寫你接收到資料後要處理的業務邏輯