百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> php - tcp 粘包/拆包实例
分享文章到:

php - tcp 粘包/拆包实例

发布时间:09/01 来源:未知 浏览: 关键词:

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肯定新闻读取完毕的问题。这就需要定义和谈和拆包。

更多PHP相关技术文章,请拜访PHP教程栏目停止学习!

以上就是php - tcp 粘包/拆包实例的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板