mina實戰demo – c/s自定義協議傳輸
github專案原始碼
為什麼要進行自定義協議傳輸?
因為傳輸過程往往不是乙個字串就可以傳輸全部資訊,並且應用程式和網路通訊之間存在物件與二進位制之間的轉換關係。所以需要結合業務編寫自定義協議包進行傳輸。
編寫自定義協議的基本步驟
通過mina文件可以看到,要實現自定義協議傳輸需要實現protocolcodecfactory介面,而protocolcodecfactory介面有兩個抽象方法,getdecoder(iosession session)
和 getencoder(iosession session) 方法。所以要先實現protocoldecoder和protocolencoder介面實現編解碼器。
1. 自定義協議資料報
協議資料報包含協議頭和協議體,協議頭儲存協議(協議頭+協議體)的長度length和版本資訊flag;協議體儲存協議內容。
public
class
protocolpack
getter and setters...
}
2. 自定義編碼器
編碼器將物件轉成位元組存入緩衝區中,並傳遞到下一層。
@override
public
void
encode
(iosession session, object msj, protocolencoderoutput out)
throws exception
3. 自定**碼器
解碼器將對應的位元組陣列解析成物件,在傳輸過程中可能會出現半包(資料傳輸不完整)的問題,所以需要乙個context上下文儲存傳輸的buffer,並將context
放入session中,下次有新的傳輸來之後就從本類的session中找到上下文,以追加的方式新增buffer
private
class
context
public
void
reset()
getters and setters...
}
@override
public
void
decode
(iosession iosession, iobuffer iobuffer, protocoldecoderoutput out)
throws exception
else
if(length >= packheadlength && length-packheadlength <= buff.
remaining()
)else}if
(buff.
hasremaining()
)else
}
4. 自定義編譯碼工廠
編譯碼工廠例項化編解碼器
public
class
protocolfactory
implements
protocolcodecfactory
getencoder and getdecoder...
}
5. 服務端
服務端主要實現編譯碼過濾器,session引數設定,繫結操作
public
class
protocolserver
}
6. 服務端handle
主要實現了異常捕獲、等待時間、訊息接收方法
public
class
serverhandle
extends
iohandleradapter
@override
public
void
exceptioncaught
(iosession session, throwable cause)
throws exception
@override
public
void
messagereceived
(iosession session, object msg)
throws exception
}
7. 客戶端
客戶端除去過濾器,session設定還通過connectfuture監聽客戶端的連線狀態,傳送資料
public
class
protocolclient}}
);}private
static
void
senddate
(iosession session)
}}
8. 客戶端handle
主要實現了等待時間、訊息接收方法
public
class
clienthandle
extends
iohandleradapter
}@override
public
void
messagereceived
(iosession session, object message)
throws exception
}
自定義 如何自定義協議
何為自定義協議,其實是相對標準協議來說的,這裡主要針對的是應用層協議 常見的標準的應用層協議如http ftp smtp等,如果我們在網路通訊的過程中不去使用這些標準協議,那就需要自定義協議,比如我們常用的rpc框架 dubbo,thrift 分布式快取 redis,memcached 等都是自定義...
自定義協議封裝包頭 包體
底層通訊訊息類,定義訊息id 訊息體,和初始化 1 using system 23 4 底層通訊訊息 5 6 public class tsocketmessage idisposable 7 2223 public void dispose 24 2829 protected virtual vo...
簡單高效可靠的自定義通訊協議(傳輸協議)
取 高效簡單可靠 這幾個形容詞還是很虛的,畢竟這是yy出來的東西。設計的目的在於 在收發雙方能夠正常執行的情況下,盡可能高的利用網路傳輸能力 不使用一應一答 以及提高傳輸效率 無須對每個報文幀進行應答 對比xmodem kermit,以及借鑑tcp的協議棧設計思想,設計一套通訊協議 1,定義傳送方s...