在上篇《
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...