iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >分享一个php的tcp粘包/拆包例子
  • 627
分享到

分享一个php的tcp粘包/拆包例子

php 2023-05-14 19:05:44 627人浏览 泡泡鱼
摘要

本文给大家介绍一个例子,有关PHP的tcp 粘包/拆包,希望对需要的朋友有所帮助~tcp 长链接模式下,使用固定消息头长度的方式进行消息 拆包 ,解决 粘包 问题。 固定消息头协议将消息头的前 N 个字节固定为 消息长度位 ,结合业务场景,

本文给大家介绍一个例子,有关PHPtcp 粘包/拆包,希望对需要的朋友有所帮助~

分享一个php的tcp粘包/拆包例子

tcp 长链接模式下,使用固定消息头长度的方式进行消息 拆包 ,解决 粘包 问题。 固定消息头协议

将消息头的前 N 个字节固定为 消息长度位 ,结合业务场景, 2bytes 或 4bytes ,读取消息时先读取 消息长度位 ,即可按具体的 消息长度 读取 消息内容 。【推荐学习php视频教程

pack/unpack 可以 打包数值至二进制 / 解包二进制至数值 ,具体的模式可以参考 pack/unpack 详细用法,这里我们选用固定头长度为 2bytes 来表示 消息体长度 ,最大能表示 2^16 - 1 长度的消息体,不够你就上 4bytes 好了。

组包

<?php
// msg protocol
// | ---- dataLen ---- | data |
// | - fixed 2bytes - |

// 模拟客户端连续发送2条消息
$foo = "hello world";
$bar = "i am sqrt_cat";

$package = "";

// 使用 n 打包 固定2bytes
$fooLenn = pack("n", strlen($foo));
$package = $fooLenn . $foo;

$barLenn = pack("n", strlen($bar));
$package .= $barLenn . $bar;

粘包

// send
// 传输 $package 由 $foo $bar 两条消息组成 模拟粘包场景
// receive

拆包

<?php
// 解析第1条消息 取前 2bytes 按 n 解包
$fooLen = unpack("n", substr($package, 0, 2))[1];
// 使用包消息体长度定义读取消息体
// 从第 3byte 开始读 前 2bytes表示长度
$foo = substr($package, 2, $fooLen);
echo $foo . PHP_EOL;

// 解析第2条消息 取前 2bytes 按 n 解包
// 0 ~ (2 + fooLen) - 1 字节序为 fooLen . foo
// (2 + fooLen) ~ (2 + fooLen) + 2 - 1 为 barLen
$barLen = unpack("n", substr($package, (2 + $fooLen), 2))[1];
$bar    = substr($package, (2 + $fooLen) + 2, $barLen);
echo $bar . PHP_EOL;

日常工作中经常遇到的 tcp 场景可能是 短连接单个消息 的模式,客户端发送一条消息后便关闭连接,服务端循环读取到 EOF 即可得到一条完整的消息。但如果是 短连接多个消息 或 长链接模式 下,就可能会发生粘包,客户端不关闭服务端无法通过 EOL 确定消息读取完毕的问题。这就需要定义协议和拆包。

以上就是分享一个php的tcp粘包/拆包例子的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 分享一个php的tcp粘包/拆包例子

本文链接: https://www.lsjlt.com/news/203372.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 分享一个php的tcp粘包/拆包例子
    本文给大家介绍一个例子,有关PHP的tcp 粘包/拆包,希望对需要的朋友有所帮助~tcp 长链接模式下,使用固定消息头长度的方式进行消息 拆包 ,解决 粘包 问题。 固定消息头协议将消息头的前 N 个字节固定为 消息长度位 ,结合业务场景,...
    99+
    2023-05-14
    php
  • 说说 TCP的粘包、拆包
    分析&回答 拆包和粘包是在socket编程中经常出现的情况, 在socket通讯过程中,如果通讯的一端一次性连续发送多条数据包,tcp协议会将多个数据包打包成一个tcp报文发送出去,这就是所谓的粘包。如果通讯的一端发送的数据包超过一次tcp...
    99+
    2023-09-05
    tcp/ip 网络 网络协议
  • php的tcp粘包和拆包怎么实现
    今天小编给大家分享一下php的tcp粘包和拆包怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。tcp 长链接模式下,使...
    99+
    2023-07-04
  • Netty解决 TCP 粘包拆包的方法
    什么是粘包/拆包        一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据。TCP通讯为何存在粘...
    99+
    2024-04-02
  • 解决TCP粘包/拆包问题的方法及示例
    TCP粘包和拆包是网络编程中常见的问题,特别是在数据传输的过程中,可能会发生将多个数据包粘在一起或将一个数据包拆成多个数据包的情况,这可能会导致应用程序无法正确解析数据,从而造成数据错误或系统故障。本文将介绍TCP粘包和拆包的原因、解决方案...
    99+
    2023-09-25
    网络 服务器 tcp/ip c# 网络协议
  • PHP中拆红包算法的示例分析
    这篇文章给大家分享的是有关PHP中拆红包算法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。PHP拆红包算法代码如下:    protected func...
    99+
    2023-06-15
  • Nodejs中Tcp封包和解包的示例分析
    这篇文章给大家分享的是有关Nodejs中Tcp封包和解包的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、粘包问题解决方案及对比很简单,既然消息没有边界,那我们在消息往...
    99+
    2024-04-02
  • webpack4之splitchunksPlugin代码包分拆的示例分析
    小编给大家分享一下webpack4之splitchunksPlugin代码包分拆的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解...
    99+
    2024-04-02
  • Golang函数的闭包应用实例分享
    Golang是一门编程语言,它以其简洁、高效、并发安全等特性,受到越来越多开发者的青睐。Golang的函数是值类型,具备高度的灵活性和扩展性,可以方便地实现闭包这一功能。闭包是函数中常用的技巧之一,它允许函数访问在外部作用域中定义的变量,并...
    99+
    2023-05-16
    Golang 闭包 应用实例
  • PHP如何判断一个字符串中是否包含一个给定的子字符串
    这篇文章将为大家详细讲解有关PHP如何判断一个字符串中是否包含一个给定的子字符串,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 判断字符串中是否包含子字符串的 PHP 函数 PHP 提供了多种函数来检查...
    99+
    2024-04-02
  • php中包含字符的示例分析
    这篇文章将为大家详细讲解有关php中包含字符的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php是什么语言php,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertext Pre...
    99+
    2023-06-14
  • 同一程序内的 Golang 包的多个实例
    各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《同一程序内的 Golang 包的多个实例》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很...
    99+
    2024-04-05
  • 如何在 PHP 中检查字符串是否包含一个子字符串
    本文将介绍在 PHP 中使用 strpos() 和 preg_match() 函数检查一个字符串是否包含子字符串的不同方法。 在 PHP 中使用 strpos() 函数检查一个字符串是否包含一个子字...
    99+
    2024-02-27
  • Java多线程Atomic包操作原子变量与原子类的示例分析
    这篇文章主要介绍Java多线程Atomic包操作原子变量与原子类的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、何谓Atomic?Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位。计算机中的...
    99+
    2023-05-30
    java
  • PHP开发实例:制作一个网络旅游分享社区
    随着互联网的普及和人们生活水平的提高,旅游已成为人们生活中必不可少的一部分。而随着人们对旅行的需求不断增加,网络旅游分享社区应运而生。网络旅游分享社区是一个为旅行者提供信息分享、交流经验和寻找旅行伙伴的平台。在这个社区中,人们可以分享自己的...
    99+
    2023-10-27
    PHP开发 分享平台 网旅社区
  • PHP开发实例:制作一个网络音乐分享社区
    随着互联网的快速发展和数字化媒体的普及,音乐已成为人们生活中不可或缺的一部分。越来越多的人使用互联网来发现、分享和欣赏音乐。为了满足用户对音乐分享的需求,许多音乐分享社区应运而生。在本篇文章中,我们将讨论如何使用PHP开发一个网络音乐分享社...
    99+
    2023-10-27
    PHP开发 网络音乐分享 社区平台
  • 分享一个mongodb和golang搭伙采坑的示例分析
    这篇文章主要介绍了分享一个mongodb和golang搭伙采坑的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是golanggolang 是Google开发的一种...
    99+
    2023-06-14
  • 《PHP响应打包教程:实战案例分享,让你的应用更快、更稳定》
    PHP响应打包教程:实战案例分享,让你的应用更快、更稳定 在开发Web应用程序时,性能和稳定性是非常重要的因素。PHP是一种非常流行的Web编程语言,因为它易于学习和使用。然而,PHP在处理大量请求时可能会出现性能问题。这就是为什么PHP响...
    99+
    2023-11-09
    响应 打包 教程
  • 一个PHP的远程图片抓取函数分享
    复制代码 代码如下: function grabImage($url, $filename = '') { if($url == '') { return false; //如果 $...
    99+
    2022-11-15
    PHP函数 远程图片抓取
  • php微信小程序解包过程的案例分析
    这篇文章给大家分享的是有关php微信小程序解包过程的案例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这个解包只能看个大概1.找到小程序压缩包1、手机root或安装模拟器(我用的是夜神)2、在模拟器上安装微信...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作