Socket開發探秘 資料封包和拆包

2021-09-05 22:11:59 字數 2436 閱讀 8854

在上篇《

socket開發探秘--基類及公共類的定義

》中介紹過,所有受到的資料報,經過系統的預處理後,都會得到乙個predata的資料實體,該實體包含了協議頭、協議內容和所屬使用者的id。predata是定義了乙個標準的協議資料格式,包含了協議關鍵字、協議內容、使用者標識的內容。

前面說了,我們資料是通過實體類作為載體的,我們知道,收到的socket資料經過粗略的解析後,就是predata型別的資料,這個是通用的資料格式,我們需要進一步處理才能轉化為所能認識的資料物件(實體類物件),同樣,我們傳送資料的時候,內容部分肯定是按照一定協議規則串聯起來的資料,那麼我們就需要把實體轉化為傳送的資料格式。綜上所述,我們通過實體類,必須實現資料的傳送和讀取的轉換。

//////

測試資料的實體類資訊

///

public

class

testdatarequest

public

testdatarequest()

//////

轉換socket接收到的資訊為物件資訊

///

///socket接收到的資訊

public

testdatarequest(

string

data) }

//////

轉換物件為socket傳送格式的字串

///

///

public

override

string

tostring()

以上把資料的處理放在了實體類中進行封包和拆包,是一種比較好的做法,但是由於資料的封包拆包是乙個繁瑣的過程,**重複性比較多,而且也容易出錯。

這裡設計了乙個基類,來改進這種方式的資料處理,我們把所有對資料的拆包和封包,利用反射機制,減少我們的**量,提高**的優雅性。

public

class

baseentity

//////

轉換socket接收到的資訊為物件資訊

///

///socket接收到的資訊

public

baseentity(

string

data)

if(fieldarray 

!=null)}

}}//////

轉換物件為socket傳送格式的字串

///

///

public

override

string

tostring()

}data 

=sb.tostring().trim('|

');if(

string

.isnullorempty(headerkey))

data 

=netstringutil.packsend(headerkey, data);

return

data;}}

以上的是實體類的基類,它封裝了資料的拆包和封包過程,只需要在子類**中指定協議頭就可以了。子類的**如下所示。

//////

測試請求

///

public

class

testdatarequest : baseentity

public

testdatarequest(

string

seq, 

string

userid, 

string

psw)

//////

轉換socket接收到的資訊為物件資訊

///

///socket接收到的資訊

public

testdatarequest(

string

data) : 

base

(data)}

下面的**是收到資料報,利用實體類建構函式,解析為實體類的操作,以及構造實體類,通過tostring()方式把實體類資訊轉化為可以傳送的資料報的操作。

private

void

testdatahandle(predata data)

", request.tostring()));

testdataanswerdata answerdata 

=new

testdataanswerdata(request.seq, request.userid, request.password);

shopclientmanager.this.addsend(data.userid, answerdata.tostring(), 

true);}

我編寫的測試例子中,實體類的繼承圖如下所示。

多執行緒開發和Socket技術

程序 每個應用程式對應乙個程序 執行緒 乙個程序至少包含乙個執行緒,執行緒要和cpu進行互動。多執行緒併發 可以理解為 同一時間 執行多件事情,如程式一邊執行,一邊計數 計時 如人一邊吃飯,一邊看電視。多執行緒併發的本質,其實並不是cpu 同時 執行多件事情,而是在不停的切換,執行一段時間事件a,切...

TCP IP和Socket開發經驗分享

比較常見的4層網路模型 圖 如下 基於應用層的開發難度是相對比較低的,因為絕大部分與連線和資料傳輸 校驗相關的事情已經交給 系統 來完成,使得開發人員只需要專注於業務即可。這種分層的技術結構是非常高階和有效的。基於應用層的開發雖然方便,但是當我們需要在功能上實現某些特殊需求的時候,就難免有些掣肘。例...

Java UDP資料報和Socket

兩個核心類datagrampacket 資料報 datagramsocket 資料報socket 接收資料報的建構函式 public datagrampacket byte buf,int length 傳送資料報的建構函式,比接收的多了傳送目標位址 public datagrampacket by...