Mina框架研究(3)

2021-06-27 23:25:49 字數 2665 閱讀 1739

**

不堪回首:@junotes

filters

iofilter 是mina框架中乙個核心的部分,如下圖,對間於ioservice和iohandle之間,用於過濾所有的i/o事件和請求,其扮演的角色就像j2ee中的servlet。

mina提供不少現成的過濾器:

1、loggingfilter :日誌過濾器,用於記錄所有的事件和請求日誌.

2、protocolcodecfilter:規約解析過濾器,用來將所有收到的bytebuffer內容轉換為pojo訊息(物件),實現往來報文的編碼和解碼;

3、compressionfilter:壓縮過濾器;

4、sslfilter …

protocolcodecfilter

相對比較常用的是protocolcodecfilter,下面主要介紹一下protocolcodecfilter的使用:

還是以官方幫助文件中例子來說明(

這是乙個伺服器程式,請求的下行報文格式:

width: 請求的寬度 

height: 請求的高度 

numchars: 生成的位元組個數

服務端返回兩張:

length1: 1的大小 

image1: 1(png格式) 

length2: 2的大小

image2: 2(png格式)

現在如果想通過mina框架來實現基於這一簡單規約的編譯碼通訊功能,應該如何做呢?

public

class imageserver

13: }
這裡先來看和filter有關的部分:

acceptor.getfilterchain().addlast("protocol", new protocolcodecfilter(new imagecodecfactory(false)));
在acceptor的filter鏈中加入我們自己的過濾器,乙個protocolcodecfilter的實現,這裡的imagecodecfactory又是什麼呢?
public

class imagecodecfactory implements protocolcodecfactory else

13:     }
14:
15:

public protocolencoder getencoder(iosession iosession) throws exception

18:
19:

public protocoldecoder getdecoder(iosession iosession) throws exception

22: }

imagecodecfactory是對介面protocolcodecfactory 的實現,是用來構建filter的。protocolcodecfactory 介面只有兩個方法:
public

inte***ce protocolcodecfactory

7:
沒錯,這個規約編譯碼工廠需要裝配乙個編碼器(encoder)和乙個解碼器(decoder):

編碼器:

public

class imagerequestencoder implements protocolencoder

12:
13:

public

void dispose(iosession session) throws exception

16: }
解碼器:

public

class imagerequestdecoder extends cumulativeprotocoldecoder else

14:     }
15: }
這裡解碼器不是直接從protocoldecoder繼承的,為什麼呢?因為實際中接受的乙個資料報並不能保證包含完整的一幀報文,就是所謂的斷幀的情況,如果用cumulativeprotocoldecoder,就不需要自己處理這種情況了,mina框架會將未解碼的資料保留,等下一包資料到來後繼續嘗試解碼;

這裡編碼器的encode和解碼器的dodecode方法就是實際用來進行應用層規約編譯碼的;其中imageresuest是下行請求規約對應pojo.

整個類的協助關係如下圖所示:

filter過濾器處理完後,就交給handler,做進一步業務處理;

response部分的就不多羅嗦了,可以看這裡

至此對mina框架用過的一些東西,從使用指南的角度做了一些總結,還有很多方面還沒有用過,先留乙個坑,等來日填補吧。mina框架最吸引我的是這種設計思想,將通訊、規約解析、業務處理分離得恰到好處,既不影響效能又方便擴充套件和替換。下一步希望從源**的角度,學習一下其內部的實現思想。

MINA 框架簡介

1。mina 框架簡介 2。iosession session可以理解為伺服器與客戶端的特定連線,該連線由伺服器位址 埠以及客戶端位址 埠來決定。客戶端發起請求時,指定伺服器位址和埠,客戶端也會指定或者根據網路路由資訊自動指定乙個位址 自動分配乙個埠。這個位址 埠對構成乙個session。sessi...

MINA 框架之IoService學習

在mina框架結構中我們知道,ioservice是mina應用程式的其中一層。它為server和client提供所有的io 服務。它處理你的應用程式和遠端對端的所有互動。其本身是乙個介面,在server端的實現為ioacceptor 在client端的實現為ioconnector 先來看看它的min...

Mina框架資料傳送流程

mina框架經常用,但是具體的細節還是摸不清楚。稍稍深入了一下 看了一下資料流程,在此做一些記錄。先看一下大致的流程。詳細的說明網上很多,比如官方 部分層的細節也沒有深究。主要看了一下iofilter 資料報傳送流程 session.write 這個函式應該是filter之前的業務。eclipse單...