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.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。
就是寫你接收到數據後要處理的業務邏輯。例如示例。