分享一个php的tcp粘包/拆包例子
本文给大家介绍一个例子,有关PHP的tcp 粘包/拆包,希望对需要的朋友有所帮助~
php入门到就业线上直播课:进入学习
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API调试工具:点击使用
tcp 长链接模式下,使用固定消息头长度的方式进行消息 拆包 ,解决 粘包 问题。 固定消息头协议
将消息头的前 N 个字节固定为 消息长度位 ,结合业务场景, 2bytes 或 4bytes ,读取消息时先读取 消息长度位 ,即可按具体的 消息长度 读取 消息内容 。【推荐学习:PHP视频教程】
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;
登录后复制