該協議類是採用包頭+包體作為數據分割符。其中包頭是個4字節的二進制數據,存在的是整個協議包的長度
對比之前的Text類,Frame類的好處在於數據本身可以是任意字符的數據
1、Frame類設計
在實現上,並不implements協議接口,只是按照其接口規範進行實現
- 類概要圖
![100、Workerman通信框架-協議Frame類解析](http://p2.ttnews.xyz/loading.gif)
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的操作
閱讀更多 iamasb 的文章