基於Socket的十六進制數據解析
數據解析的思路
基本思路
- 消息結構體,存儲從緩存中解析的數據; buffer
- 回調函數,從緩存中解析數據時調用;
- 循環隊列,用於緩存接收到的數據;
關鍵實現: - 把接收到的數據存儲到緩存中,並準備解析;
- 遞歸解析消息
客戶端和服務器端
-
首先定義一個類存放消息中包含的信息;是實體類;類中包括客戶端和服務端的兩種消息;
或者客戶端和服務端分開寫兩個實體類存放消息; -
根據一定的協議對其編解碼,定義一個interface,提供序列化和反序列化方法,
(1)toWire()根據一個特定的消息,將消息轉換成字節序列;
(2)formWire()根據相同的協議,對給定的字節序列解析,根據信息的內容返回一個消息類的實例; -
實現接口的兩個類,一個基於文本的編碼方式,一個基於十六進制的編碼方式;
- 基於文本的編碼方式:
使用ASCII字符集對文本進行編碼,消息開頭是一個字符序列,用於快速將協議的消息和網 絡中隨機的垃圾消息區分開;
對射發送/接收消息的布爾值,是否爲服務器發送響應消息,標記對射的ID,編碼成十進制;
(1) toWire()簡單的創建了一個字符串,該字符串包含了消息的所有字段,並通過空白符隔開。
(2)fromWire()首先檢查魔術字符串,如果在消息前沒有魔術字符串,則拋出一個異常。
注意程序對來源與網絡的消息數據進行輸入!
- 基於文本的編碼方式:
- 基於十六進制的編碼
基於十六進制對消息進行編碼的程序,與文本編碼相反,十六進制使用固定大小的消息,每條消息由一個特殊的字節開始,該字節最高X位爲一個魔術值,該字節的哪幾位對布爾值進行了編碼,消息的哪幾個字節總是不變,消息的哪幾個字節是ID值,只有響應消息的哪幾個字節包含數據信息,字節序列的格式如下:
<“id”><#acct>
其中 = [#acct|event gg zone ] or
當事件類型爲NULL/ACK/DUH時data段爲[]。當事件類型爲ADM-CID時data段格式爲[#acct|event gg zone];
第一個<#acct>爲主機賬號;
第一個<#acct>爲安定寶ID;