Apache Mina是一個可以幫助用戶開發高性能和高伸縮性網絡應用程序的框架。它經過Java nio技術基於TCP/IP和UDP/IP協議提供了抽象的、事件驅動的、異步的API。html
Mina包的簡介:java
org.apache.mina.core.buffer | 用於緩衝區的IoBuffer |
org.apache.mina.core.service org.apache.mina.transport.* |
用於提供鏈接的service |
org.apache.mina.core.session | 用於提供兩端狀態的session |
org.apache.mina.core.filterchain org.apache.mina.filter.* |
用於攔截全部IO事件和請求的filter chain和各種攔截器(在IoService和IoHandler之間) |
org.apache.mina.handler.* | 用於處理IO事件的handler |
org.apache.mina.core.future | 用於實現異步IO操做的 future |
org.apache.mina.core.polling | 用於實現IO輪詢的的polling |
org.apache.mina.proxy.* | 用於實現代理的proxy |
先介紹Mina幾個重要接口:apache
MIINA架構圖服務器
在圖中的模塊鏈中,IoService 即是應用程序的入口,至關於咱們前面代碼中的 IoAccepter,IoAccepter 即是 IoService 的一個擴展接口。IoService 接口能夠用來添加多個 IoFilter,這些 IoFilter 符合責任鏈模式並由 IoProcessor 線程負責調用。而 IoAccepter 在 ioService 接口的基礎上還提供綁定某個通信端口以及取消綁定的接口。網絡
IoAcceptor acceptor = new SocketAcceptor();
上面代碼中,至關於咱們使用了 Socket 通信方式做爲服務的接入,當前版本的 MINA 還提供了除 SocketAccepter 外的基於數據報文通信的 DatagramAccepter 以及基於管道通信的 VmPipeAccepter。另外還包括串口通信接入方式,目前基於串口通信的接入方式已經在最新測試版的 MINA 中提供。你也能夠自行實現 IoService 接口來使用本身的通信方式。session
而在上圖中最右端也就是 IoHandler,這即是業務處理模塊。在業務處理類中不須要去關心實際的通信細節,只管處理客戶端傳輸過來的信息便可。編寫 Handler 類就是使用 MINA 開發網絡應用程序的重心所在,至關於 MINA 已經幫你處理了全部的通信方面的細節問題。爲了簡化 Handler 類,MINA 提供了 IoHandlerAdapter 類,此類僅僅是實現了 IoHandler 接口,但並不作任何處理。數據結構
一個 IoHandler 接口中具備以下一些方法(摘自 MINA 的 API 文檔):多線程
前面咱們提到 IoService 是負責底層通信接入,而 IoHandler 是負責業務處理的。那麼 MINA 架構圖中的 IoFilter 做何用途呢?答案是你想做何用途均可以。可是有一個用途倒是必須的,那就是做爲 IoService 和 IoHandler 之間的橋樑。IoHandler 接口中最重要的一個方法是 messageReceived,這個方法的第二個參數是一個 Object 型的消息,總所周知,Object 是全部 Java 對象的基礎,那到底誰來決定這個消息究竟是什麼類型呢?答案也就在這個 IoFilter 中。在前面使用的例子中,咱們添加了一個 IoFilter 是 new ProtocolCodecFilter(new TextLineCodecFactory()),這個過濾器的做用是未來自客戶端輸入的信息轉換成一行行的文本後傳遞給 IoHandler,所以咱們能夠在 messageReceived 中直接將 msg 對象強制轉換成 String 對象。架構
而若是咱們不提供任何過濾器的話,那麼在 messageReceived 方法中的第二個參數類型就是一個 byte 的緩衝區,對應的類是 org.apache.mina.core.buffer.IoBuffer。雖然你也能夠將解析客戶端信息放在 IoHandler 中來作,但這並非推薦的作法,使原來清晰的模型又模糊起來,變得 IoHandler 不僅是業務處理,還得充當協議解析的任務。框架
MINA自身帶有一些經常使用的過濾器,例如LoggingFilter(日誌記錄)、BlackListFilter(黑名單過濾)、CompressionFilter(壓縮)、SSLFilter(SSL加密)等。
簡單地來說,就分爲三層:
客戶端的通訊過程:
IoFilterChain做爲消息過濾鏈
客戶端通訊過程 IoSession貫穿整個通訊過程的始終
建立服務器
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 = 6488; public static void main(String[] args) throws IOException { // 建立服務端監控線程 IoAcceptor acceptor = new NioSocketAcceptor(); acceptor.getSessionConfig().setReadBufferSize(2048); acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); // 設置日誌記錄器 acceptor.getFilterChain().addLast("logger", new LoggingFilter()); // 設置編碼過濾器 acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); // 指定業務邏輯處理器 acceptor.setHandler(new TimeServerHandler()); // 設置端口號 acceptor.bind(new InetSocketAddress(PORT)); // 啓動監聽線程 acceptor.bind(); } }
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 sessionCreated(IoSession session){ // 顯示客戶端的ip和端口 System.out.println(session.getRemoteAddress().toString()); } @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { cause.printStackTrace(); } /** * 消息接收事件 */ @Override public void messageReceived(IoSession session, Object message) throws Exception { String strMsg = message.toString(); if (strMsg.trim().equalsIgnoreCase("quit")) { session.close(true); return; } // 返回消息字符串 session.write("Hi Client!"); // 打印客戶端傳來的消息內容 System.out.println("Message written : " + strMsg); } @Override public void sessionIdle(IoSession session, IdleStatus status) throws Exception { System.out.println("IDLE" + session.getIdleCount(status)); } }
客戶端
import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.mina.core.future.ConnectFuture; 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.NioSocketConnector; public class MinaTimeClient { public static void main(String[] args){ // 建立客戶端鏈接器. NioSocketConnector connector = new NioSocketConnector(); connector.getFilterChain().addLast("logger", new LoggingFilter()); connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); // 設置鏈接超時檢查時間 connector.setConnectTimeoutCheckInterval(30); connector.setHandler(new TimeClientHandler()); // 創建鏈接 ConnectFuture cf = connector.connect(new InetSocketAddress("192.168.2.109", 6488)); // 等待鏈接建立完成 cf.awaitUninterruptibly(); cf.getSession().write("Hi Server!"); cf.getSession().write("quit"); // 等待鏈接斷開 cf.getSession().getCloseFuture().awaitUninterruptibly(); // 釋放鏈接 connector.dispose(); } }
import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; public class TimeClientHandler extends IoHandlerAdapter { public void messageReceived(IoSession session, Object message) throws Exception { String content = message.toString(); System.out.println("client receive a message is : " + content); } public void messageSent(IoSession session, Object message) throws Exception { System.out.println("messageSent -> :" + message); } }
http://my.oschina.net/ielts0909/blog?catalog=253154
http://www.blogjava.net/mikechen/archive/2012/03/15/371938.html
http://dxf1122.blog.163.com/blog/static/54041004200931371414356/
http://blog.sina.com.cn/s/blog_7abc61de0100sdoi.html
http://mina.apache.org/mina-project/documentation.html
http://wenku.baidu.com/view/b9af67c34028915f804dc292.html
http://wenku.baidu.com/view/46800bce0508763231121232.html
http://wenku.baidu.com/view/5ccc7935b90d6c85ec3ac6e7.html