天天看點

Apache Mina使用手記(四) Apache Mina使用手記(四)

上一篇中,我們介紹了如何在mina中編寫自己的日志過濾器,這一篇我們自己實作一個編解器。

實際應用當,很多應用系統應用的都不是标準的web service或XML等,比如象中國移動/聯通/電信的短信網關程式,都有自己不同的協定實作,并且都是基于TCP/IP的位元組流。Mina自帶的編解碼器實作了TextLineEncoder和TextLineDecoder,可以進行按行的字元串處理,對于象短信網關程式,就要自己實作編解碼過濾器了。

我們定義一個簡單的基于TCP/IP位元組流的協定,實作在用戶端和服務端之間的資料包傳輸。資料包MyProtocalPack有消息頭和消息體組成,消息頭包括:length(消息包的總長度,資料類型int),flag(消息包标志位,資料類型byte),消息體content是一個字元串,實際實作的時候按byte流處理。源代碼如下:

回過頭來,我們先看一下在MinaTimeServer中,如何使用一個文本的編解碼過濾器,它是在過濾器鍊中添加了一個叫ProtocalCodecFilter的類,其中它調用了一個工廠方法TextLineCodecFactory的工廠類,建立具休的TextLineEncoder和TextLineDecoder編碼和解碼器。我們看一下具體的源代碼:

TextLineFactory實作了ProtocalCodecFactory接口,該接口主要有一個編碼的方法getEncoder()和一個解碼的方法getDecoder():

我們主要是仿照TextLineEncoder實作其中的encode()方法,仿照TextLineDecoder實作其中的decode()即可,它們分别實作了ProtocalEncoder和ProtocalDecoder接口。我們要編寫三個類分别是:MyProtocalCodecFactory,MyProtocalEncoder,MyProtocalDecoder對應TextLineCodecFactory,TextLineEncoder,TextLineDecoder。

在MyProtocalServer中,添加自己實作的Log4jFilter和編解碼過濾器:

編寫一個用戶端程式進行測試:

也可以用IoConnector實作自己的用戶端: