php中使用swoole实现头协议
2018-06-22 05:30:48来源:未知 阅读 ()
当需要有数据交互的时候,为了安全起见,双方会协商一个固定的头协议,这样必须实现其头协议才能拿到数据。
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]就可以接收到第一个传的数据?望知道的大神不吝赐教!
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:PHP高效率写法
- PHP写UltraEdit插件脚本实现方法 2020-03-29
- php 带逗号千位符数字的处理方法 2020-03-28
- PHP三元运算符的结合性介绍 2020-03-28
- PHP静态延迟绑定和普通静态效率的对比 2020-03-28
- 基于php流程控制语句和循环控制语句 2020-03-28
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash