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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章