swoole中tcp传输如何按固定包数据结构传输?
网友回复
swoole提供了内置包长检测的方法,该方法提供了固定包头 + 包体这种格式协议的解析。
启用后,可以保证 Worker 进程 onReceive 每次都会收到一个完整的数据包。
长度检测协议,只需要计算一次长度,数据处理仅进行指针偏移,性能非常高,推荐使用。
可见官方是推荐使用这种方式的,就是配置比其他方案要复杂一些, 首先贴一下配置:
$server->set([
// 打开包长检测特性
'package_length_check' => true,
// 包头中某个字段作为包长度的值,底层支持了 10 种长度类型。可参考 pack() 方法
'package_length_type' => 'N',
// length 长度值在包头的第几个字节。
'package_length_offset' => 8,
// 从第几个字节开始计算长度,一般有 2 种情况:
//length 的值包含了整个包(包头 + 包体),package_body_offset 为 0
//包头长度为 N 字节,length 的值不包含包头,仅包含包体,package_body_offset 设置为 N
'package_body_offset' => 16,
// 设置最大数据包尺寸,单位为字节
'package_max_length' => 81920
]);
下面是一个数据包结构例子,可以很好的体现了字段含义。
下面看具体的示例代码:
tcp服务端代码
<?php $serv = new Swoole\Server('127.0.0.1', 9...
点击查看剩余70%