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开发自学