先上图

server 端

client 客户端

原文参考  https://blog.csdn.net/ldy3243942/article/details/40920743

3.固定包头类型协议

固定包头协议是在实际应用中最常用的协议。该协议的内容是规定一个固定长度的包头,在包头的固定位置有一个指定好的字段存放了后续数据的实际长度。这样,服务器端可以先读取固定长度的数据,从中提取出长度,然后再读取指定长度的数据,即可获取一段完整的数据。
在Swoole中,同样提供了固定包头的协议格式。需要注意的是,Swoole只允许二进制形式的包头,因此,需要使用pack、unpack来打包、解包。
通过设置open_length_check选项,即可打开固定包头协议解析功能。此外还有package_length_offset,package_body_offset和package_length_type三个配置项用于控制解析功能。package_length_offset规定了包头中第几个字节开始是长度字段,package_body_offset规定了包头的长度,package_length_type规定了长度字段的类型。
具体设置如下:

$this->serv->set(array(
    'package_max_length' => 8192,
    'open_length_check'=> true,
    'package_length_offset' => 0,
    'package_body_offset' => 4,
    'package_length_type' => 'N'
));

具体如何设置这些参数请参考文档
OK,废话不多讲,直接上实例:
服务器端:

public function onReceive( swoole_server $serv, $fd, $from_id, $data ) {    $length = unpack("N" , $data)[1];
    echo "Length = {$length}\n";
    $msg = substr($data,-$length);
    echo "Get Message From Client {$fd}:{$msg}\n";
}

客户端:

$msg_length = pack("N" , strlen($msg_normal) ). $msg_normal;

$i = 0;
while( $i < 100 ) {    $this->client->send( $msg_length );
    $i ++;
}

直接运行,Perfect!
点此查看完整实例

点此查看其他相关源码

下面是server代码 稍作修改

<?php
class Server
{private $serv;public function __construct() {$this->serv = new swoole_server("0.0.0.0", 9501);$this->serv->set(array('worker_num' => 8,'daemonize' => false,'max_request' => 10000,'dispatch_mode' => 2,'package_max_length' => 8192,'open_length_check'=> true,'package_length_offset' => 0,'package_body_offset' => 4,'package_length_type' => 'N'));$this->serv->on('Start', array($this, 'onStart'));$this->serv->on('Connect', array($this, 'onConnect'));$this->serv->on('Receive', array($this, 'onReceive'));$this->serv->on('Close', array($this, 'onClose'));$this->serv->start();}public function onStart( $serv ) {echo "Start\n";}public function onConnect( $serv, $fd, $from_id ) {echo "Client {$fd} connect\n";}public function onReceive( swoole_server $serv, $fd, $from_id, $data ) {print($data);file_put_contents("2.txt",$data);//This is a Msgecho "\n";print_r(unpack("N",$data));/*Array([1] => 13)*/$length = unpack("N" , $data)[1];echo "Length = {$length}\n";$msg = substr($data,-$length);echo "Get Message From Client {$fd}:{$msg}\n";}public function onClose( $serv, $fd, $from_id ) {echo "Client {$fd} close connection\n";}
}
new Server();

客户端代码 client

<?php
class Client
{private $client;public function __construct() {$this->client = new swoole_client(SWOOLE_SOCK_TCP);}public function connect() {if( !$this->client->connect("127.0.0.1", 9501 , 1) ) {echo "Error: {$fp->errMsg}[{$fp->errCode}]\n";}$msg_normal = "This is a Msg";
//              $msg_eof = "This is a Msg\r\n";//      echo  pack("N" , strlen($msg_normal) );$msg_length = pack("N" , strlen($msg_normal) ). $msg_normal;file_put_contents("1.txt",$msg_length);$i = 0;while( $i < 5 ) {$this->client->send( $msg_length );$i ++;}}
}
$client = new Client();
$client->connect();~                                   

看下1.txt 发现前面变成看不懂的 也就是二进制流

到此为止 就结束了 server端应该也是收到流才对

再看下server 的2.txt

server 端生成的  同样也是二进制再开头的

大概就这样了

swoole 固定包头格式相关推荐

  1. java数据存入txt_java将数据写入到txt文件中(txt有固定的格式)

    java将数据写入到txt文件中,这个应该对于学过java I/O的人来说是很简单的事情了,但是如果要将数据以固定的格式写入到txt文件中,就需要一定的技巧了. 这里举个简单的例子,以供参考: 比如我 ...

  2. 如何修改固定了格式的WPS表格

    很多情况下,我们可能会遇到WPS的 excel 表格的格式已经被固定为某种特定的格式,比如日期或者有下拉选框等等,而且我们往表格里面填写内容的时候,就会报错:请按照XX格式填写,例如XX,给我们带来很 ...

  3. 由freemarker毫秒级时间谈固定日期格式

    需要在freemarker中呈现毫秒级时间,查了很多资料,始终不对.最后终于弄明白原因:java和c#中日期的毫秒表示是不同的.c#中的毫秒级用f表示,java中用S表示.而我将一直在java中用C# ...

  4. js验证用户输入的 座机/手机/固定电弧 格式是否正确

    编写方法如下 const checkTelephone = (value) => {var isMobilePhone = /^([0-9]{3,4}-)?[0-9]{7,8}$/;var is ...

  5. bootstrap bootstraptable 固定列_1个Excel公式按条件自定义格式显示固定电话号码

    点击右上角"关注",每天免费获取干货教程 前面写了很多篇关于数据查询.数据统计.数据分析.公式排错的教程,今天换一个口味,写个关于自定义格式显示数据的教程. 因为工作中很多时候都需 ...

  6. 网络处理中TLV形式的不固定格式匹配

    假设如果已经实现了控制平面和数据转发平面的分离,即SDN,那么网络协议就被弱化了!为何如此放狂言?还得从历史说起! 如果上面的假设不成立,那么如何实现独立的控制平面和独立的数据平面,对于控制平面,简单 ...

  7. 当SWOOLE遇上PROTOCOL

    前言 上回我们简单介绍了一下TCP Server的工作方式以及如何用Swoole实现一个简单的TCP Server,这次我们来聊聊信息流动中,非常重要基石之一--协议(PROTOCOL). 协议,通信 ...

  8. PS流包格式之PS/SYS/PSM/PES头

    PS流包格式 1,PS流的基本组成 PS流由很多个PS包组成. 每个PS包由如下组成: PS header + SYS header(I帧)+PSM header(I帧) +PES header+ P ...

  9. Swoole基础知识,安装,websocket应用及各种问题详解

    1. swoole基础-概述 Swoole基础课程正式推出!零基础开始,让你循环渐进的掌握swoole. 传统的phper们大部分都是用于开发web应用程序,并且大部分都是在用类似yii\larave ...

最新文章

  1. 某股份制商业银行数据中心灾备建设经验
  2. 10分钟理解依赖注入
  3. VIP到131970年过期就离谱~
  4. 160-PHP 文本替换函数str_replace(一)
  5. Java异常详解及如何处理
  6. 服务器与网页之间异步,在服务器端判断request来自Ajax请求(异步)还是传统请求(同步)...
  7. SQL Server - 聚集索引 第六篇
  8. java.io.IOException: Bad connect ack with firstBad
  9. postgre管理员 无法访问表_PostgreSQL常见问题处理方法
  10. c语言goto语句用法_C语言的9种控制结构
  11. 如何计算两向量的夹角
  12. 海森矩阵介绍及其在机器学习、深度学习中的理解
  13. 摄影测量简答题和作图题
  14. 如何规范小开发公司的测试流程。?
  15. 西宾知乎语音下载工具(zhihudownload)
  16. Hermez官方文档翻译(四)开发者-SDK (有自己测试验证demo)
  17. 在python中输入圆的半_极客起源 - geekori.com - 问题详情 - python动态圆更新糅合到地图显示里...
  18. Bili视频弹幕播放器后台源码
  19. Konga面板接入LDAP踩坑实战
  20. 什么是安卓马甲APP?寻求高手安卓马甲包封装APP上架

热门文章

  1. MAC终端命令学习(入门版)
  2. P-GCN:Graph Convolutional Networks for Temporal Action Localization 2019 ICCV
  3. Vue.js项目中,当图片无法显示时则显示默认图片
  4. 总用量的统计_每月公开使用量!广州市开启机制砂信息采集工作
  5. Hadoop集成环境搭建
  6. Linux故障自愈脚本,实现故障自愈要攻克的3个问题以及开箱即用的方案
  7. Java事务管理之Hibernate
  8. Excel 使用技巧之 -- 统计、过滤与引用数据
  9. 虚拟服务器设置 - 百度,百度云虚拟主机BCH配置伪静态图文教学
  10. 程序员合同日期不到想辞职_辞职报告怎么写最简单?写清楚理由和时间,签上姓名就OK了...