生活随笔
收集整理的這篇文章主要介紹了
Apache Mina开发手册
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作者:chszs,轉載需注明。博客主頁:http://blog.csdn.net/chszs
一、介紹
Apache Mina是一個網絡應用框架,簡化用戶開發高性能、高可擴展性的網絡應用程序的難度。Mina提供了一個抽象的事件驅動的異步API,通過Java NIO實現各種傳輸協議如TCP/IP和UDP/IP。
Apache Mina經常用作:
1)NIO框架庫
2)客戶端/服務器通信框架庫
3)網絡Socket通信庫
?
Apache Mina還伴隨有不少子項目:
1)Asyncweb
構建于Apache Mina異步框架之上的HTTP服務器
2)FtpServer
一個FTP服務器
3)SSHd
一個Java庫,支持SSHH協議
4)Vysper
一個XMPP服務器
二、Apache Mina下載
下載最新的Mina v2.0.8版
地址見:http://mina.apache.org/mina-project/downloads.html
三、用Mina開發時間服務器
說明一下,其實是基于官方的例子,略作了修改,因為發現官方的例子太陳舊,甚至包含了deprecated的方法。
?
1、先決條件
Apache Mina 2.0.8 Core
JDK 7
SLF4J+LOGBACK
?
2、項目依賴包
mina-core-2.0.8.jar
slf4j-api-1.6.6.jar
3、編寫基于Mina的Time服務器
[java] ?view plaincopyprint?
package ?ch.chiqms.server;?? ?? import ?java.io.IOException;?? import ?java.net.InetSocketAddress;?? import ?java.nio.charset.Charset;?? ??? importorg.apache.mina.core.service.IoAcceptor;?? importorg.apache.mina.core.session.IdleStatus;?? importorg.apache.mina.filter.codec.ProtocolCodecFilter;?? importorg.apache.mina.filter.codec.textline.TextLineCodecFactory;?? importorg.apache.mina.filter.logging.LoggingFilter;?? import ?org.apache.mina.transport.socket.nio.NioSocketAcceptor;?? ??? public ? class ?MinaTimeServer?{?? ?????????privatestatic?final ? int ?PORT?=? 9123 ;?? ?????????publicstatic?void ?main(String[]?args){?? ????????????????????? ???????????????????IoAcceptoracceptor?=?new ?NioSocketAcceptor();?? ???????????????????? ????????????????????? ????????????????????? ????????????????????? ???????????????????acceptor.getFilterChain().addLast("logger" , new ?LoggingFilter());?? ???????????????????acceptor.getFilterChain().addLast("codec" , new ?ProtocolCodecFilter(?? ?????????????????????????????????????newTextLineCodecFactory(Charset.forName("UTF-8" ))));?? ??????????????????? ????????????????????? ???????????????????acceptor.setHandler(newTimeServerHandler());?? ???????????????????? ????????????????????? ???????????????????acceptor.getSessionConfig().setReadBufferSize(2048 );?? ???????????????????acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10 );?? ???????????????????? ???????????????????try {?? ????????????????????????????acceptor.bind(newInetSocketAddress(PORT));?? ???????????????????}catch ?(IOException?e)?{?? ????????????????????????????e.printStackTrace();?? ???????????????????}?? ?????????}?? }??
4、編寫Time服務的Handler
[java] ?view plaincopyprint?
package ?ch.chiqms.server;?? ??? import ?java.text.SimpleDateFormat;?? import ?java.util.Calendar;?? ??? import ?org.apache.mina.core.service.IoHandlerAdapter;?? importorg.apache.mina.core.session.IdleStatus;?? importorg.apache.mina.core.session.IoSession;?? ??? public ? class ?TimeServerHandler?extendsIoHandlerAdapter?{?? ??? ?????????@Override ?? ?????????publicvoid?exceptionCaught(IoSession?session,?Throwable?cause)?? ????????????????????????????throwsException?{?? ???????????????????cause.printStackTrace();?? ?????????}?? ??? ?????????@Override ?? ?????????publicvoid?messageReceived(IoSession?session,?Object?message)?throws ?Exception?{?? ???????????????????Stringstr?=?message.toString();?? ???????????????????if (str.trim().equalsIgnoreCase( "quit" )){?? ????????????????????????????session.close(true );?? ????????????????????????????return ;?? ???????????????????}?? ???????????????????Calendartime?=?Calendar.getInstance();?? ???????????????????SimpleDateFormatdf?=?new ?SimpleDateFormat( "yyyy-MM-dd?HH:mm:ss" );?? ???????????????????session.write(df.format(time.getTime()));?? ???????????????????System.out.println("TimeMessage?written..." );?? ?????????}?? ??? ?????????@Override ?? ?????????publicvoid?sessionIdle(IoSession?session,?IdleStatus?status)?throws ?Exception?{?? ???????????????????System.out.println("IDLE" +session.getIdleCount(status));?? ?????????}?? ??? }??
5、運行MinaTimeServer
在命令行輸入telnet 127.0.0.1 9123
服務器端的輸出也可以看到:
[javascript] ?view plaincopyprint?
SLF4J:?Failed?to?load? class "org.slf4j.impl.StaticLoggerBinder" .?? SLF4J:?Defaulting?to?no-operation?(NOP)logger?implementation?? SLF4J:?Seehttp:?? Time?Message?written...?? Time?Message?written...?? Time?Message?written... ?
四、NIO概述
NIO API是Java 1.4版引入的,NIO的意思是非阻塞的I/O通信。 要知道Mina的NIO是基于NIO-1開發的,而在JDK 7中引入了NIO-2的庫,但Mina還沒有從NIO-2中獲得各方面的提升,因此Mina還是基于NIO-1的。 雖然Oracle官方是把NIO的N作為New的解釋,但業界普遍把這個N解釋為Non-Blocking。 Mina目前分為1.x和2.x兩個主要版本,兩個版本的主要區別在于1.x使用傳統I/O方式,而2.x使用NIO方式。由于NIO是無阻塞的,而傳統IO是阻塞的,所以2.x版本性能會有所提高。但是由于NIO比傳統IO更加難于理解,實現更加復雜,想自己開發基于NIO的高性能服務器難度較大,所以這也是選擇Mina框架的原因。 Mina 3.x目前還在開發階段,到時候會通過NIO-2進一步提升通信性能。 java.nio.*包中包含了幾個關鍵的結構: 1)Buffer:數據的容器 2)Charset:字節和Unicode編碼的容器轉換器 3)Channel:封裝了I/O操作的實體的連接表現 4)Selector:提供了可選擇的、多分復用的非阻塞I/O 5)Regexps:提供了一些操作正則表達式的工具 使用Mina的優點: 1)隱藏了開發網絡程序的復雜性,提供了統一的編程接口; - 用Java NIO實現TCP/IP和UDP/IP通信 - 用RXTX實現RS232串口通信 - VM級的管道通信 - 實現自己的傳輸協議
2)與Servlet相似的過濾器接口,支持擴展
3)低層和高層API - 低層:使用字節緩沖ByteBuffer - 高層:使用用戶定義的消息對象和編碼
4)高可定制的線程模型 - 單線程 - 單個線程池 - 多個線程池(即SEDA)
5)通過Java 5的SSLEngine實現開箱即用的SSL、TLS和StartTLS
6)過載防護與流量限制
7)使用mock對象使用單元可測試性
8)JMX管理能力
9)通過StreamIoHandler支持流I/O
10)可與PicoContainer或Spring框架相集成
11)可從Mina 1.x和Netty平滑遷移 五、Mina應用程序架構
1、基于Mina應用程序的架構
基于Mina的應用程序的架構通常是這樣的:
可以看出,Mina是應用程序和網絡層之間的膠水層,可以通過Mina完成TCP、UDP通信,甚至是串口RS-232C通信。Mina屏蔽了網絡編程的復雜性,你只需專心于處理業務邏輯。
下面我們繼續深入Mina框架:
廣義上來講,基于Mina的應用程序可以劃分為三層:
1)I/O Service:I/O服務,執行實際的I/O通信。 2)I/O Filter Chain:I/O過濾器鏈,把字節過濾/轉換成所需的數據結構,反之亦然。 3)I/O Handler:I/O句柄,放置實際的業務邏輯。 因此,要想創建基于Mina的應用程序,你必須:
1)創建I/O服務 可選擇已有的服務(*Acceptor)或創建自己的I/O服務。
2)創建過濾器鏈 可選擇已有的過濾器或創建自定義的過濾器,用于轉換請求/響應的數據
3)創建I/O句柄 寫業務邏輯,處理不同的消息
總結
以上是生活随笔 為你收集整理的Apache Mina开发手册 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。