Apache MINA是一個網絡應用程序框架,它用來幫助咱們輕鬆的創建高性能的,高可擴展的網絡應用程序.它爲各類傳輸(好比TCP/IP,UDP/IP)提供了抽 象的,事件驅動的,異步的API.它也經常被被稱做"NIO框架庫","客戶服務框架庫","網絡套接字庫"
java
使用MINA的必要條件:web
MINA 2.0.7 Core
JDK 1.5 +
SLF4J 1.3.0 +(確保使用正確的SLF4J版原本匹配你的日誌框架,如:slf4j-log4j12.jar 和 log4j-1.3.x.jar不能一塊兒工做)spring
*SLF4J:簡單日誌門面,它容許你搭配使用任意的日誌框架並提供統一的對外接口,它使用了靜態綁定,這意味着對應每個日誌框架都有一個對應的JAR.以下所示:apache
Logging framework | Required JARs |
---|---|
Log4J 1.2.x | slf4j-api.jar, slf4j-log4j12.jar** |
Log4J 1.3.x | slf4j-api.jar, slf4j-log4j13.jar |
java.util.logging | slf4j-api.jar, slf4j-jdk14.jar** |
Commons Logging | slf4j-api.jar, slf4j-jcl.jar |
注意:api
1.slf4j-api.jar是必須的.網絡
2.應該有且只有一個日誌框架被配置到class path,如slf4j-log4j12.jar和slf4j-jdk14.jar不能共存,會產生不可預期的行爲.session
3.slf4j-api.jar和slf4j-.jar的版本應該對應一致. 多線程
服務端示例:框架
public class MinaTimeServer { private static final int PORT = 9123; public static void main(String[] args) throws IOException { // 咱們須要一個對象來監聽鏈接(NioSocketAcceptor對應TCP,NioDatagramAcceptor對應UDP) IoAcceptor acceptor = new NioSocketAcceptor(); // 組件過濾器鏈 acceptor.getFilterChain().addLast("logger", new LoggingFilter());// 日誌過濾器 acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));// 編解碼過濾器 // 定義處理器,它是MINA程序核心將實時的服務於客戶端鏈接請求,它必須實現IoHandler接口 acceptor.setHandler(new TimeServerHandler()); // 設置Session配置信息 acceptor.getSessionConfig().setReadBufferSize(2048);// 告訴操做系統分配多少空間給傳輸數據 acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);// 會話閒置斷定,第一個參數指定斷定行爲依據,第二個參數指定行爲持續時間(秒) // 綁定端口並啓動監聽 acceptor.bind(new InetSocketAddress(PORT)); } } //核心處理類 //IoHandlerAdapter是IoHandler具體實現,繼承它能夠簡化代碼 public class TimeServerHandler extends IoHandlerAdapter { @Override // 一場捕獲方法應該始終被實現,不然異常將沒法正確報告,儘管它的代碼邏輯在大多數狀況下都是簡單的打印和關閉會話這種固化標準模式 public void exceptionCaught(IoSession session, Throwable cause) throws Exception { cause.printStackTrace(); session.close(); } @Override // 用來實時和客戶端進行數據交互,根據定義的編解碼過濾器的不一樣,message將會有所不一樣,同時寫出數據也要求不一樣 // 若是沒有指定編解碼過濾器,message將是IoBuffer,對應的也要求寫出的格式是IoBuffer 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)); } }
和Spring整合(順帶一提,看不懂的自行查閱相關資料):異步
<!-- 處理類 --> <bean id="timeHandler" class="com.night.mina.TimeServerHandler"> <!-- 多線程 --> <bean id="CTP" class="java.util.concurrent.Executors" factory-method="newCachedThreadPool"></bean> <bean id="executorFilter" class="org.apache.mina.filter.executor.ExecutorFilter"> <constructor-arg ref="CTP"></constructor-arg> </bean> <!-- 日誌過濾器 --> <bean id="loggingFilter" class="org.apache.mina.filter.logging.LoggingFilter" /> <!-- 過濾器鏈 --> <bean id="filterChainBuilder" class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder"> <property name="filters"> <map> <entry key="executor" value-ref="executorFilter" /> <entry key="loggingFilter" value-ref="loggingFilter" /> </map> </property> </bean> <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"> <property name="customEditors"> <map> <entry key="java.net.SocketAddress" value="org.apache.mina.integration.beans.InetSocketAddressEditor" /> </map> </property> </bean> <!-- 監聽類 --> <bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor" init-method="bind" destroy-method="unbind"> <property name="defaultLocalAddress" value=":9123" /> <property name="handler" ref="timeHandler" /> <property name="filterChainBuilder" ref="filterChainBuilder" /> </bean>