热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php沾包,swoole处理粘包和分包问题,如何处理二进制数据包。

swoole支持固定包头包体和以EOF为结尾的两种分包。具体代码实现可以参考ti-rpc,这个代码片段。publicstaticfunctionencode(arra

swoole支持固定包头+包体和以EOF为结尾的两种分包。

具体代码实现可以参考ti-rpc,这个代码片段。

public static function encode(array $data, $type = "tcp")

{

if ('tcp' == $type) {

if ('eof' == self::$tcpPack) {

$data = json_encode($data) . '\r\n';

} else if ('length' == self::$tcpPack) {

$data = json_encode($data);

$data = pack('N', strlen($data)) . $data;

}

return $data;

} else {

return json_encode($data);

}

}

/*

* @desc : 配置packet的拆包方式

*/

public static function decode($jsonString, $type = "tcp")

{

if ('tcp' == $type) {

if ('eof' == self::$tcpPack) {

$jsonString = str_replace('\r\n', '', $jsonString);

} else if ('length' == self::$tcpPack) {

$header = substr($jsonString, 0, 4);

$len = unpack('Nlen', $header);

$len = $len['len'];

$jsonString = substr($jsonString, 4, $len);

}

return json_decode($jsonString, true);

} else {

return json_decode($jsonString, true);

}

}

https://wiki.swoole.com/wiki/...

以EOF分包,有两种情况,一种是以末尾的EOF进行分包,一种是以数据中出现的EOF进行分包,后者效率比较低。

然后就是包头定长+包体这种了。

首先要知道网络字节序,以及本地字节序,说白了就是多字节在传输中的先后顺序

https://www.v2ex.com/t/330173

大端 :数据的高字节放在内存的低地址上,小端反之。

php中常用的函数就是pack()和unpack()两个函数。

上边代码就是先获取数据长度,然后用4字节的整型格式写入二进制字符串中。

最后解包,然后根据长度截取数据。

在swoole中也有相关的配置,如一楼给你的链接



推荐阅读
  • 本文探讨了浏览器的同源策略限制及其对 AJAX 请求的影响,并详细介绍了如何在 Spring Boot 应用中优雅地处理跨域请求,特别是当请求包含自定义 Headers 时的解决方案。 ... [详细]
  • 本文探讨了如何在Node.js环境中,通过Tor网络使用的SOCKS5代理执行HTTP请求。文中不仅提供了基础的实现方法,还介绍了几种常用的库和工具,帮助开发者解决遇到的问题。 ... [详细]
  • 本文详细介绍了如何在现有的Android Studio项目中集成JNI(Java Native Interface),包括下载必要的NDK和构建工具,配置CMakeLists.txt文件,以及编写和调用JNI函数的具体步骤。 ... [详细]
  • 本文介绍如何在Windows Forms应用程序中使用C#实现DataGridView的多列排序功能,包括升序和降序排序。 ... [详细]
  • 微信小程序实现拍照与图片上传功能
    本文介绍如何在微信小程序中实现用户通过拍照或从相册选择图片,并将图片上传至服务器的功能,包括调用相关API和处理上传响应。 ... [详细]
  • Node.js 中 GET 和 POST 请求的数据处理
    本文详细介绍了如何在 Node.js 中使用 GET 和 POST 方法来处理客户端发送的数据。通过示例代码展示了如何解析 URL 参数和表单数据,并提供了完整的实现步骤。 ... [详细]
  • 本文详细介绍了如何正确安装Java EE SDK,并解决在安装过程中可能遇到的问题,特别是关于servlet代码在Apache Tomcat 10中无法运行的情况。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 深入理解String.Format()方法的应用
    在.NET框架中,String.Format()方法是一种非常实用的工具,它能够帮助开发者以灵活多样的方式格式化字符串。本文将通过一个具体的示例,详细介绍如何利用String.Format()方法处理数值、日期时间和枚举类型的格式化。 ... [详细]
  • Java实现文本到图片转换,支持自动换行、字体自定义及图像优化
    本文详细介绍了如何使用Java实现将文本转换为图片的功能,包括自动换行、自定义字体加载、抗锯齿优化以及图片压缩等技术细节。 ... [详细]
  • 本文介绍了在Android项目中实现时间轴效果的方法,通过自定义ListView的Item布局和适配器逻辑,实现了动态显示和隐藏时间标签的功能。文中详细描述了布局文件、适配器代码以及时间格式化工具类的具体实现。 ... [详细]
  • 利用Python实现自动化群发邮件
    本文详细介绍如何使用Python语言来实现邮件的自动群发功能,适合希望提高工作效率的技术爱好者和开发者。 ... [详细]
  • 详解 | 日志系统ViseLog的基本使用与功能
    本文详细介绍了日志系统ViseLog的使用方法及其核心功能,旨在帮助开发者更好地理解和利用这一工具,提高开发效率。 ... [详细]
  • PySpark实战:高效使用DataFrame超越RDD
    本文深入探讨了PySpark中DataFrame的使用方法及其相对于传统RDD的优势,旨在帮助开发者更好地理解和利用这一强大工具。 ... [详细]
  • 微信小程序koa获取微信accesstoken ... [详细]
author-avatar
yubu5208_176
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有