php - tcp 粘包/拆包实例-php教程

资源魔 33 0

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 粘包/拆包实例的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学

抱歉,评论功能暂时关闭!