TCP數據分包

使用tcp協議,由於沒有包的概念,當發送數據比較頻繁時就會出現粘包的現在,即收到的數據兩次不完整或有多出來的,要解決這一問題,需要手動定義分包規則.

workman中的text協議是以”\n”來判斷包是否結束,即收到的數據判斷有”\n”則一個包結束,剩下的就是下一個包,發送時也是給數據拼接一個”\n”達到分包的效果.

如果發送時沒有”\n”會導致包的完整性判斷出錯,因此,在不同的場合需要按照需求更改協議規則,當前項目就需要已”}”來判斷是否是一個包的結束.因此判斷需要加上”}”判斷.

完整代碼:

// 檢查包的長度,長度超出最大長度則斷開連接
if (strlen($buffer) >= TcpConnection::$maxPackageSize) {
    $connection->close();
    return 0;
}
//  查找"\n"的位置
$pos = strpos($buffer, "\n");
// 沒有"\n"則判斷是否存在自定義規則
if ($pos === false) {
    // 存在自定義規則則返回規則的位置
    $pos1 = strpos($buffer, "}");
    if($pos1){
        return $pos1 +  1;
    }
    return 0;
}
// 有'\n'返回'\n'的位置
return $pos + 1;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章