我們知道,消息在網(wǎng)路上傳輸?shù)氖亲止?jié)流,而我們主流的面向?qū)ο笙到y(tǒng)中處理的卻是 “ 對象 ” ,如何將從網(wǎng)絡(luò)上接收到的字節(jié)流轉(zhuǎn)化為 “ 對象 ” ,又如何將 “ 對象 ” 轉(zhuǎn)化為字節(jié)流以便通過網(wǎng)絡(luò)傳遞給其他系統(tǒng),這便是 IContract 接口定義的內(nèi)容:

2 /// IContract用于抽象通信協(xié)議格式的基礎(chǔ)接口。
3 /// </summary>
4 public interface IContract
5 {
6 void FillMyself( byte []data, int offset); // 將流解析為對象
7 int GetStreamLength();
8
9 byte []ToStream(); // 將對象轉(zhuǎn)化為流
10 void ToStream( byte []buff, int offset);
11 }
IContract
接口中的各個(gè)成員的意思非常的清楚,含有
offset
參數(shù)的重載
ToStream
方法(第
10
行)可以將轉(zhuǎn)化的結(jié)果流寫到指定的
buff
中,這個(gè)方法是必須的,否則就會(huì)遇到很多需要拷貝緩沖區(qū)的操作,這將嚴(yán)重的損害運(yùn)行的效率。
很多朋友一定想到了,
.NET
中將對象轉(zhuǎn)化為字節(jié)流或?qū)⒘鬓D(zhuǎn)化為對象的最方便的方式就是使用
“
序列化
”
,是的,如果各個(gè)通信的系統(tǒng)都是基于
.NET
平臺(tái)創(chuàng)建的,當(dāng)然沒有問題,這種情況下,使用
.NET Remoting
可能會(huì)更好(使用
Remoting
可以完全省略對消息協(xié)議的關(guān)心,因?yàn)?
Remoting
已經(jīng)幫你打點(diǎn)好了一切)。但是更多的情況是,相互通信的系統(tǒng)是異構(gòu)的。比如,服務(wù)端是
.NET
平臺(tái),而客戶端卻是
PDA
上
C++
寫的程序,遇到這種情形,
.NET
的序列化、
Remoting
就無能為力了,我們必須自己手動(dòng)打理一切。你也許會(huì)說,可以使用
WebService
?呵呵,好了,
ESFramework
主要關(guān)注的是構(gòu)建基于
Tcp
或
Udp
網(wǎng)絡(luò)系統(tǒng),至于什么情況下,該使用
WebService
還是該直接在更低層的
TCP/UDP
上構(gòu)建系統(tǒng)的問題,還是留待讀者自己去思考吧:)
如果不能使用
.NET
的
“
序列化
”
,那么常用的是什么方法來完成
“
字節(jié)流《=》消息對象
”
的轉(zhuǎn)換了,即
IContract.FillMyself
和
IContract.ToStream
的實(shí)現(xiàn)方式是什么?一個(gè)字節(jié)一個(gè)字節(jié)的處理。比如,我們消息協(xié)議中規(guī)定,接收到的字節(jié)流的前四個(gè)字節(jié)是一個(gè)使用
UTF8
編碼的字符串
“@@@@”
,那么,我們解析時(shí),就用
UTF8
來將接收到的前
4
個(gè)字節(jié)解析為字符串
“@@@@”
。接下來的
4
個(gè)字節(jié)是一個(gè)整數(shù),那么你可以使用
BitConverter
類來將這四個(gè)字節(jié)解析為一個(gè)整數(shù),
......
如此,一直將所有字節(jié)流解析完畢,生成一個(gè)完整的
“
消息對象
”
。至于字節(jié)流中的第幾個(gè)字節(jié)放什么內(nèi)容,那是你的構(gòu)建應(yīng)用時(shí)必須定義好的--消息協(xié)議。所有的消息協(xié)議都實(shí)現(xiàn)
IContract
接口。在此基礎(chǔ)之上,應(yīng)用系統(tǒng)才可以在不了解協(xié)議內(nèi)部細(xì)節(jié)的情況下,對所有的消息進(jìn)行統(tǒng)一的處理(這就是
“
多態(tài)
”
的應(yīng)用?。?,如此才有可能實(shí)現(xiàn)系統(tǒng)運(yùn)行中動(dòng)態(tài)加載功能插件的能力。
ESFramework
是一個(gè)框架,它不關(guān)注你具體應(yīng)用中的具體消息協(xié)議,它只關(guān)注
IContract
接口,這樣
ESFramework
框架才可以在不同的應(yīng)用中復(fù)用。如果要使
ESFramework
框架幫助我們構(gòu)建應(yīng)用時(shí)更加容易,
ESFramework
就需要把我們應(yīng)用中更多共性提取出來,那么它必須
“
標(biāo)準(zhǔn)化
”
更多的東西,
IContract
只是其中的一個(gè)。接下來的文章中你會(huì)看到
NetMessage
的引入,系統(tǒng)之間通過網(wǎng)絡(luò)交互的消息都可以表示成
NetMessage
,并且
NetMessage
游走于系統(tǒng)內(nèi)部的各處理器、鉤子
Hook
之間,正是由于這種前后一致性,使得
NetMessage
成為
ESFramework
的核心要素之一,關(guān)于
NetMessage
的具體介紹請留意下篇文章:
ESFramework
介紹之(
2
)――網(wǎng)絡(luò)通信消息
NetMessage
轉(zhuǎn)到:
ESFramework 可復(fù)用的通信框架(序)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
