Apache的Mina(Multipurpose Infrastructure Networked Applications)是一個(gè)網(wǎng)絡(luò )應用框架,可以幫助用戶(hù)開(kāi)發(fā)高性能和高擴展性的網(wǎng)絡(luò )應用程序;它提供了一個(gè)抽象的、事件驅動(dòng)的異步API,使Java NIO在各種傳輸協(xié)議(如TCP/IP,UDP/IP協(xié)議等)下快速高效開(kāi)發(fā)。

Mina的工作流程,也涵蓋了Mina的三個(gè)核心接口:IoService接口,IoFilter接口和IoHandler接口
第一步. 創(chuàng )建服務(wù)對象(客戶(hù)端或服務(wù)端) ---IoService接口實(shí)現
第二步. 數據過(guò)濾(編碼解碼、日志等) ---IOFilter接口實(shí)現
第三步. 業(yè)務(wù)處理 ---IoHandler接口實(shí)現
1.IoService接口
作用:IoService是創(chuàng )建服務(wù)的頂層接口,無(wú)論客戶(hù)端還是服務(wù)端,都是從它繼承實(shí)現的。
IoService接口聲明了服務(wù)端的共有屬性和行為
IoAcceptor接口繼承了IoService接口,并添加了服務(wù)端特有的接口屬性及方法,比如bind()方法,成為典型的服務(wù)端接口;
IoConnector接口同樣繼承了IoService接口,并添加了客戶(hù)端特有的接口屬性及方法,比如connect()方法,成為典型的客戶(hù)端接口;
實(shí)現類(lèi)有NioSocketAcceptor(服務(wù)端),NioSocketConnector(客戶(hù)端)

通過(guò)acceptor.seHandler添加IoHandler
服務(wù)端必須指定綁定的端口號
客戶(hù)端必須指定請求的服務(wù)器地址和端口號
2.IoFilter接口
Mina最主要的工作就是把底層傳輸的字節碼轉換為Java對象,提供給應用程序;或者把應用程序返回的結果轉換為字節碼,交給底層傳輸。這些都是由IoFilter完成的,因此IoFilter是Mina的精髓所在。
IoService實(shí)例會(huì )綁定一個(gè)DefaultIoFilterChainBuilder ---- 過(guò)濾器鏈,我們把自定義的各種過(guò)濾器(IoFilter)自由的插放在這個(gè)過(guò)濾器鏈上了,類(lèi)似于一種可插拔的功能!

LoggingFilter是根據IoSession的狀態(tài)(創(chuàng )建、開(kāi)啟、發(fā)送、接收、異常等等)來(lái)記錄會(huì )話(huà)的事件信息的!這對我們跟蹤IoSession很有用。當地,也可以自定義logger的日志級別,定義記錄那些狀態(tài)的日志。
ProtocolCodecFilter是設置編碼解碼。Mina中傳輸的所有二進(jìn)制信息都存放在IoBuffer中,IoBuffer是對Java NIO中ByteBuffer的封裝(Mina2.0以前版本這個(gè)接口也是ByteBuffer),提供了更多操作二進(jìn)制數據,對象的方法,并且存儲空間可以自增長(cháng),用起來(lái)非常方便;簡(jiǎn)單理解,它就是個(gè)可變長(cháng)度的byte數組!
ExecutorFilter 將IO線(xiàn)程與業(yè)務(wù)處理線(xiàn)程分開(kāi),I/O Processor的線(xiàn)程數量由CPU的核數決定,由于業(yè)務(wù)處理部分消耗時(shí)間過(guò)長(cháng),如果和IO線(xiàn)程在一個(gè)里面會(huì )造成阻塞。
ExecutorFilter 缺省使用OrderedThreadPoolExecutor線(xiàn)程池。
需要注意的是這個(gè)線(xiàn)程池,對應同一個(gè)session而言,是順序執行的.
3.IoHandler接口
IoHandler是Mina實(shí)現其業(yè)務(wù)邏輯的頂級接口;在IoHandler中定義了7個(gè)方法,根據I/O事件來(lái)觸發(fā)對應的方法:
sessionCreated:當一個(gè)新的連接建立時(shí),由I/O processor thread調用;
sessionOpened:當連接打開(kāi)是調用;
messageReceived:當接收了一個(gè)消息時(shí)調用;
messageSent:當一個(gè)消息被(IoSession#write)發(fā)送出去后調用;
sessionIdle:當連接進(jìn)入空閑狀態(tài)時(shí)調用;
sessionClosed:當連接關(guān)閉時(shí)調用;
exceptionCaught:當實(shí)現IoHandler的類(lèi)拋出異常時(shí)調用;
一般情況下,我們最關(guān)心的只有messageReceived方法,接收消息并處理,然后調用IoSession的write方法發(fā)送出消息?。ㄗ⒁猓哼@里接收到的消息都是Java對象,在IoFilter中所有二進(jìn)制數據都被解碼啦?。?br>一般情況下很少有人實(shí)現IoHandler接口,而是繼承它的一個(gè)實(shí)現類(lèi)IoHandlerAdapter,這樣不用覆蓋它的7個(gè)方法,只需要根據具體需求覆蓋其中的幾個(gè)方法就可以!
聯(lián)系客服