最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • PHP的tcp 粘包/拆包概述例子

    正文概述 转载于:掘金(程序员安安)   2020-12-21   342

    tcp 长链接模式下,使用固定消息头长度的方式进行消息 拆包 ,解决 粘包 问题。 固定消息头协议

    将消息头的前N个字节固定为 消息长度位 ,结合业务场景, 2bytes 或 4bytes ,读取消息时先读取 消息长度位 ,即可按具体的 消息长度 读取 消息内容 。

    pack/unpack 可以 打包数值至二进制 / 解包二进制至数值 ,具体的模式可以参考pack/unpack 详细用法,这里我们选用固定头长度为 2bytes 来表示 消息体长度 ,最大能表示 2^16 - 1 长度的消息体,不够你就上 4bytes 好了。

    组包

    <?php
    // msg protocol
    // | ---- dataLen ---- | data |
    // | - fixed 2bytes  - |
    
    // 模拟客户端连续发送2条消息
    $foo = "hello world";
    $bar = "i am sqrt_cat";
    
    $package = "";
    
    // 使用 n 打包 固定2bytes
    $fooLenn = pack("n", strlen($foo));
    $package = $fooLenn . $foo;
    
    $barLenn = pack("n", strlen($bar));
    $package .= $barLenn . $bar;
    

    粘包

    // send
    // 传输 $package 由 $foo $bar 两条消息组成 模拟粘包场景
    // receive
    

    拆包

    <?php
    // 解析第1条消息 取前 2bytes 按 n 解包
    $fooLen = unpack("n", substr($package, 0, 2))[1];
    // 使用包消息体长度定义读取消息体
    // 从第 3byte 开始读 前 2bytes表示长度
    $foo = substr($package, 2, $fooLen);
    echo $foo . PHP_EOL;
    
    // 解析第2条消息 取前 2bytes 按 n 解包
    // 0 ~ (2 + fooLen) - 1 字节序为 fooLen . foo
    // (2 + fooLen) ~ (2 + fooLen) + 2 - 1 为 barLen
    $barLen = unpack("n", substr($package, (2 + $fooLen), 2))[1];
    $bar    = substr($package, (2 + $fooLen) + 2, $barLen);
    echo $bar . PHP_EOL;
    

    日常工作中经常遇到的 tcp 场景可能是 短连接单个消息 的模式,客户端发送一条消息后便关闭连接,服务端循环读取到 EOF 即可得到一条完整的消息。但如果是 短连接多个消息 或 长链接模式 下,就可能会发生粘包,客户端不关闭服务端无法通过 EOL 确定消息读取完毕的问题。这就需要定义协议和拆包。

    以上内容希望帮助到大家, 很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干需


    起源地下载网 » PHP的tcp 粘包/拆包概述例子

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元