博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php中使用swoole实现头协议
阅读量:5092 次
发布时间:2019-06-13

本文共 2011 字,大约阅读时间需要 6 分钟。

当需要有数据交互的时候,为了安全起见,双方会协商一个固定的头协议,这样必须实现其头协议才能拿到数据。

PHP的swoole完美的提供了固定包头+包体协议自动分包。

首先需要通过open_length_check打开固定包头包体协议,再用package_length_offset规定包头中第几个字节是整个包长度,package_body_offset是从第几个字节开始计算长度,比如包头为长度为120字节,第10个字节为长度值,包体长度为1000。如果长度包含包头,这里填入0,如果不包含包头,这里填入120。最后一个是package_length_type,表示长度字段的类型,涉及到网络字节序和机器字节序,都是以字节为单位的。详细信息可以自己去了解。配置如下:

$this->serv->set(array(            'open_length_check' => true,   //打开固定包头协议解析功能            'package_length_offset' => 0,  //规定了包头中第几个字节开始是长度字段            'package_body_offset' => 0,    //length的值包含了整个包(包头+包体)            'package_length_type' => 'N',   //规定了长度字段的类型        ));

php中的pack和unpack可以用来处理和解析网络字节序。比如:我们发的包头是

$length=40+strlen($data);$serv->send($fd, pack("N", $length));$serv->send($fd, pack("C", $msg_type));$serv->send($fd, pack("C", $replyCipher));$serv->send($fd, pack("C", $compress));$serv->send($fd, $uuid);$serv->send($fd,$data);

也许有人会问,为什么长度是40加上包体长度,因为我们这里的N是无符号、网络字节序、4字节,而是无符号、1字节,然后规定uuid的长度是为33个字节,所以整个包头长度为33+4+1+1+1,那就是40了。至于各个字段的意义,那是看你们自己的定义的。

包头发了,肯定就有解析,这里只说明PHP对以上包头的解析。其实很简单,只是按照上面的顺序逐一用unpack解析出来就可以了。

//获取整个消息的长度        $msg_length = unpack("N", $data)[1];        $data = substr($data, 4);//        echo "整个消息的长度:".$msg_length.PHP_EOL;        //消息类型        $msg_type = unpack("C", $data)[1];        $data = substr($data, 1);//        echo "消息类型:".$msg_type.PHP_EOL;        //服务端响应包体是否需要加密标识  0-不需要加密  1-需要加密  保留字段        $replyCipher = unpack("C", $data)[1];        $data = substr($data, 1);//        echo "响应包体是否加密标识:".$replyCipher.PHP_EOL;        //获取包体是否需要压缩标识  0-未压缩 1-压缩  保留字段        $compress = unpack("C", $data)[1];        $data = substr($data, 1);//        echo "包体是否压缩标识:".$compress.PHP_EOL;        //请求者ID        $uuid = substr($data, 0, 33);//        echo "请求者ID:". $uuid.PHP_EOL;        //获取包体        $data = substr($data, 33);//        echo $data;

因为开启了open_length_check,所以swoole会在你接收到全部的数据后,才开始对数据进行处理。不过我有一点不明白,为什么接收到整个数据后,用unpack("N", $data)[1]就可以接收到第一个传的数据?望知道的大神不吝赐教!

转载于:https://www.cnblogs.com/johnson108178/p/7792313.html

你可能感兴趣的文章
malloc分配的内存空间是连续的吗
查看>>
Rsync服务及搭建备份服务器
查看>>
网络、邻居、共享
查看>>
探索WebKit内核(一)------ 菜鸟起步
查看>>
chromium中的性能优化工具syzyProf
查看>>
标准文档流
查看>>
EL标签学习
查看>>
我的每日所学
查看>>
Thrift之代码生成器Compiler原理及源码详细解析2
查看>>
HTML列表
查看>>
THUSC2016 游记
查看>>
1283 最简单的计算机
查看>>
使用自定义条件触发Nintex workflow
查看>>
C语言学习笔记(零)
查看>>
在moss上自己总结了点小经验。。高手可以飘过
查看>>
web ide
查看>>
UE4开始之路
查看>>
offset Dimensions 详解
查看>>
容量规划的一些探讨与实践
查看>>
wamp环境下php命令运行时出现错误:无法启动此程序,因为计算机中丢失OCI.dll。尝试重新安装该程序以解决此问题...
查看>>