100、Workerman通信框架-協議Frame類解析

該協議類是採用包頭+包體作為數據分割符。其中包頭是個4字節的二進制數據,存在的是整個協議包的長度

對比之前的Text類,Frame類的好處在於數據本身可以是任意字符的數據

1、Frame類設計

在實現上,並不implements協議接口,只是按照其接口規範進行實現

  • 類概要圖
100、Workerman通信框架-協議Frame類解析

2、核心方法解析

2.1、encode

該靜態方法接收參數$buffer

計算$buffer參數的長度後與4進行相加

然後調用pack把長度轉換成4字節的二進制再與$buffer進行拼接

然後返回

2.2、decode

該靜態方法接收參數$buffer

調用函數substr,從4開始截取

然後返回

2.3、input

該靜態方法接收參數$buffer和傳輸層$connection對象

判斷參數$buffer的長度,如果小於4則返回0

調用upack獲取一個協議包的長度

然後返回

3、問題

為什麼encode的時候,需要把數據的長度累加4

答: Frame協議的一個協議包為 包頭(4字節)+包體。也就是說包頭的長度是4。假設不累加4,在進行解包時,對包頭的二進制進行upack時,得到的長度就是包體的長度。這時按照一個協議包去截取數據時,就少了包頭的4個字節,因此需要補上4。即在encode把4累加進去,就少了解包環節補加4的操作


分享到:


相關文章: