Swoole怎么实现一个自定义的TCP协议

使用Swoole实现自定义TCP协议需解决粘包问题,可通过EOF分隔或固定包头+包体格式。1. EOF方式在消息末尾添加特殊字符如n,配置open_eof_split和package_eof即可;2. 推荐使用带长度字段的二进制协议,设置open_length_check、package_length_type等参数,使Swoole自动解析;3. 对复杂协议可结合长度检测并手动提取命令码、版本、校验和等字段,在receive回调中完成校验与业务处理。核心是利用Swoole的协议解析能力正确切分消息边界。

swoole怎么实现一个自定义的tcp协议

要使用 Swoole 实现一个自定义的 TCP 协议,关键在于解决“粘包”问题。TCP 是流式协议,数据可能被拆分或合并传输,因此你需要在应用层定义一种规则来划分消息边界。Swoole 提供了多种方式支持自定义协议解析,最常用的是通过设置 EOF 或使用 固定包头 + 包体 格式。

1. 使用固定分隔符(EOF)实现简单协议

这种方式适合调试或简单场景。你可以在每条消息末尾添加一个特殊字符作为结束标记,比如换行符 n 或自定义字符串 ###。

Swoole 服务器配置示例如下:

$server = new SwooleServer("0.0.0.0", 9501);$server->set([    'open_eof_split' => true, // 启用 EOF 分割    'package_eof'    => "n", // 定义结束符]);$server->on('connect', function ($server, $fd) {    echo "Client: {$fd} connected.n";});$server->on('receive', function ($server, $fd, $reactorId, $data) {    // $data 已经是去掉 n 的完整消息    echo "Received: {$data}n";    $server->send($fd, "Server received: {$data}n");});$server->on('close', function ($server, $fd) {    echo "Client: {$fd} closed.n";});$server->start();

客户端发送消息时必须带上 n 才能被正确解析。

2. 使用固定包头 + 包体协议(推荐)

更通用的方式是定义二进制协议,包含长度字段的包头。Swoole 支持自动解析这种格式,只需正确配置 package_length_type、package_body_offset 等参数。

假设你的协议格式如下:

前 4 字节:包体长度(int,大端)后续数据:实际内容

服务端配置:

通义万相 通义万相

通义万相,一个不断进化的AI艺术创作大模型

通义万相 596 查看详情 通义万相

$server = new SwooleServer("0.0.0.0", 9502);$server->set([    'open_length_check'        => true,           // 开启长度检测    'package_length_type'      => 'N',            // unsigned int, 4 字节,大端    'package_length_offset'    => 0,              // 长度字段偏移量    'package_body_offset'      => 4,              // 包体起始位置    'package_max_length'       => 8192,           // 最大包长]);$server->on('receive', function ($server, $fd, $reactorId, $data) {    // $data 是完整的包体(不含包头)    echo "Received body: " . strlen($data) . " bytesn";    $server->send($fd, "ok");});$server->start();

客户端发送时需先写入长度:

$client = new SwooleClient(SWOOLE_SOCK_TCP);$client->connect('127.0.0.1', 9502);$message = "Hello Swoole Custom Protocol!";$length = pack('N', strlen($message)); // 打包 4 字节长度$client->send($length . $message);

3. 自定义复杂协议(如带命令码、校验和)

如果你的协议更复杂,比如:

4 字节长度2 字节命令码1 字节版本n 字节数据4 字节 CRC 校验

你可以依然使用 open_length_check,但需要自己处理校验逻辑:

$server->set([    'open_length_check'     => true,    'package_length_type'   => 'N',    'package_length_offset' => 0,    'package_body_offset'   => 7, // 跳过 len(4)+cmd(2)+ver(1)    'package_max_length'    => 16384,]);

然后在 receive 回调中手动提取字段并校验:

$server->on('receive', function ($server, $fd, $reactorId, $rawData) {    $len   = unpack('N', substr($rawData, 0, 4))[1];    $cmd   = unpack('n', substr($rawData, 4, 2))[1];    $ver   = ord(substr($rawData, 6, 1));    $body  = substr($rawData, 7, -4); // 去掉头尾    $crc   = substr($rawData, -4);    if (md5($body) !== $crc) {        $server->close($fd);        return;    }    // 处理业务...});

小结

实现自定义 TCP 协议的核心是让 Swoole 能正确切分消息。你可以选择:

简单文本协议:用 EOF 分隔通用二进制协议:用 包头长度字段 配合 Swoole 的自动解析复杂协议:在基础解析上自行提取字段并校验

只要包头中包含长度信息,Swoole 就能帮你完成粘包处理,剩下的交给业务逻辑即可。

以上就是Swoole怎么实现一个自定义的TCP协议的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/420675.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Win7如何禁用休眠快捷键?Win7禁用休眠快捷键的方法
上一篇 2025年11月7日 09:14:32
《光与影:33号远征队》幕后开发故事 竟是由一群“草台班子”组成
下一篇 2025年11月7日 09:14:36

相关推荐

  • sublime怎么配置react开发环境_Sublime搭建React.js开发环境全攻略

    sublime怎么配置react开发环境_Sublime搭建React.js开发环境全攻略sublime怎么配置react开发环境_Sublime搭建React.js开发环境全攻略sublime怎么配置react开发环境_Sublime搭建React.js开发环境全攻略sublime怎么配置react开发环境_Sublime搭建React.js开发环境全攻略

    答案是配置Babel语法高亮、ESLint代码检查和Prettier自动格式化。首先安装Package Control以管理插件,接着安装Babel插件并设置JavaScript (Babel)为默认语法;然后通过Node.js安装ESLint并配置SublimeLinter-eslint进行实时错…

    2026年9月28日 • 用户投稿
    200
  • 解决Spring Boot与React应用在AWS部署中CORS错误的终极指南

    解决Spring Boot与React应用在AWS部署中CORS错误的终极指南解决Spring Boot与React应用在AWS部署中CORS错误的终极指南解决Spring Boot与React应用在AWS部署中CORS错误的终极指南解决Spring Boot与React应用在AWS部署中CORS错误的终极指南

    本文旨在解决在Spring Boot后端(AWS EC2)和React前端(AWS S3)部署时,即使服务器端已配置宽松的CORS策略,仍出现跨域资源共享(CORS)错误的问题。我们将深入探讨常见误区,并提供一个将CORS配置与Spring Security有效整合的专业解决方案,同时强调处理wit…

    2026年9月27日 • 用户投稿
    200
  • 机械键盘不同轴体对编程效率有影响吗?

    答案是机械键盘轴体通过影响手感、反馈和舒适度间接提升编程效率。线性轴顺滑适合快速输入,段落轴提供确认感减少误触,点击轴反馈强但噪音大,选择需结合个人习惯、环境及疲劳管理;此外,键帽、布局、自定义功能与人体工学设计也显著影响编程体验。 机械键盘的不同轴体,在我看来,确实会对编程效率产生影响,但这影响并…

    2026年9月27日
    200
  • 如何在 Reactor 中向现有 Flux 引入数据并合并流

    如何在 Reactor 中向现有 Flux 引入数据并合并流如何在 Reactor 中向现有 Flux 引入数据并合并流如何在 Reactor 中向现有 Flux 引入数据并合并流如何在 Reactor 中向现有 Flux 引入数据并合并流

    本文旨在深入探讨如何在 Reactor 框架中,特别是面对由外部库提供的现有 Flux 时,有效地引入新数据并将其与现有流合并。文章将阐明直接“发射”到 Flux 的局限性,重点讲解通过创建新的数据流并使用 Flux.merge 等操作符进行合并的策略,同时强调了处理一次性订阅 Flux 的关键注意…

    2026年9月27日 • 用户投稿
    100
  • Selenium自动化测试:应对动态ID与XPath定位挑战

    Selenium自动化测试:应对动态ID与XPath定位挑战Selenium自动化测试:应对动态ID与XPath定位挑战Selenium自动化测试:应对动态ID与XPath定位挑战Selenium自动化测试:应对动态ID与XPath定位挑战

    本文探讨Selenium自动化测试中,因页面元素动态ID变化导致NoSuchElementException的问题。通过分析By.name的稳定性及介绍XPath的contains()函数,提供了一系列健壮的元素定位策略,旨在提升测试脚本的可靠性和维护性,确保自动化测试在面对动态Web内容时依然有效…

    2026年9月27日 • 用户投稿
    200
  • sublime怎么设置jsx和tsx的区别高亮_sublime JSX与TSX区别高亮配置

    sublime怎么设置jsx和tsx的区别高亮_sublime JSX与TSX区别高亮配置sublime怎么设置jsx和tsx的区别高亮_sublime JSX与TSX区别高亮配置sublime怎么设置jsx和tsx的区别高亮_sublime JSX与TSX区别高亮配置sublime怎么设置jsx和tsx的区别高亮_sublime JSX与TSX区别高亮配置

    首先安装Babel插件支持JSX,再安装TypeScript插件处理TSX;然后将.jsx文件关联到JavaScript (Babel)语法,.tsx文件设置为TypeScript或TypeScriptReact模式,即可实现正确语法高亮。 Sublime Text 要实现 JSX 和 TSX 文件…

    2026年9月27日 • 用户投稿
    200
  • sublime如何处理带bom的utf-8文件_sublime带BOM的UTF-8文件处理

    sublime如何处理带bom的utf-8文件_sublime带BOM的UTF-8文件处理sublime如何处理带bom的utf-8文件_sublime带BOM的UTF-8文件处理sublime如何处理带bom的utf-8文件_sublime带BOM的UTF-8文件处理sublime如何处理带bom的utf-8文件_sublime带BOM的UTF-8文件处理

    Sublime Text处理带BOM的UTF-8文件时默认不明确提示,可能引发兼容性问题。1. 可通过状态栏显示“UTF-8 with BOM”或使用HexViewer插件检查EF BB BF字节判断BOM存在。2. 保存时可通过“File → Save with Encoding”选择UTF-8(…

    2026年9月27日 • 用户投稿
    000
  • Laravel认证系统怎么快速搭建_Laravel认证系统快速搭建方法

    最直接的方法是使用Laravel Breeze,它提供完整的认证功能。首先创建项目并安装Breeze,运行php artisan breeze:install选择Blade模板,接着安装前端依赖并编译资源,最后执行数据库迁移。完成后即可访问注册和登录页面。Breeze轻量简洁,适合中小型项目;若需团…

    2026年9月27日
    100
  • sublime怎么让自动补全菜单显示更多信息_sublime自动补全菜单增强信息显示

    sublime怎么让自动补全菜单显示更多信息_sublime自动补全菜单增强信息显示sublime怎么让自动补全菜单显示更多信息_sublime自动补全菜单增强信息显示sublime怎么让自动补全菜单显示更多信息_sublime自动补全菜单增强信息显示sublime怎么让自动补全菜单显示更多信息_sublime自动补全菜单增强信息显示

    启用LSP插件并配置语言服务器,可使Sublime Text补全菜单显示函数签名、参数、类型及文档等详细信息,提升编码效率。 Sublime Text 默认的自动补全菜单只显示简单的函数名或变量名,信息有限。想要让补全项显示更多上下文信息(如参数列表、类型、文档摘要等),可以通过配置设置和安装插件来…

    2026年9月27日 • 用户投稿
    100
  • 剪映创作者交流会:全面引入AI能力,打造一站式创作工具

    剪映创作者交流会:全面引入AI能力,打造一站式创作工具剪映创作者交流会:全面引入AI能力,打造一站式创作工具剪映创作者交流会:全面引入AI能力,打造一站式创作工具剪映创作者交流会:全面引入AI能力,打造一站式创作工具

    日前,剪映在2025创作者交流大会上以“all in ai,all in one,创作,无限新可能”为主题,全面展示了其在ai领域的最新进展,并与众多内容创作者深入探讨了人工智能如何重构视频创作流程、降低技术门槛,激发更广泛的创意潜能。 剪映产品负责人在会上表示,剪映的愿景是成为每一位创作者的“全能…

    2026年9月26日 • 用户投稿
    1100
  • ️「SpringBoot3.2深度探索」WebFlux性能优化与RSocket集成指南

    ️「SpringBoot3.2深度探索」WebFlux性能优化与RSocket集成指南️「SpringBoot3.2深度探索」WebFlux性能优化与RSocket集成指南️「SpringBoot3.2深度探索」WebFlux性能优化与RSocket集成指南️「SpringBoot3.2深度探索」WebFlux性能优化与RSocket集成指南

    Spring Boot 3.2通过升级底层依赖、增强GraalVM Native Image支持、深化Micrometer Tracing集成及引入Project Loom虚拟线程,优化WebFlux性能;同时通过spring-boot-starter-rsocket简化RSocket集成,实现高效…

    2026年9月26日 • 用户投稿
    000
  • 如何在Java中实现对象克隆

    答案是Java中实现对象克隆需实现Cloneable接口并重写clone()方法,分为浅克隆和深克隆:浅克隆复制基本类型字段值,引用类型仅复制地址;深克隆则递归复制所有对象,确保完全独立。可通过手动克隆引用字段或序列化实现深克隆,使用时需注意异常处理、访问权限及可变对象的隔离问题,尽管克隆机制存在但…

    2026年9月26日
    200
  • TPM 2.0芯片除了加密还有哪些实用功能?

    TPM 2.0芯片除了加密还有哪些实用功能?TPM 2.0芯片除了加密还有哪些实用功能?TPM 2.0芯片除了加密还有哪些实用功能?TPM 2.0芯片除了加密还有哪些实用功能?

    TPM 2.0不仅是加密工具,更是硬件级安全基石,通过构建信任链确保系统启动完整性,支持安全启动、设备健康证明、凭据保护及远程认证,广泛应用于企业零信任架构、虚拟化安全与身份验证(如Windows Hello、FIDO2),实现从固件到操作系统的全流程防护。 TPM 2.0芯片远不止是加密的工具,它…

    2026年9月25日 • 用户投稿
    100
  • 快速搭建一个管理App数据和用户的界面

    快速搭建一个管理App数据和用户的界面快速搭建一个管理App数据和用户的界面快速搭建一个管理App数据和用户的界面快速搭建一个管理App数据和用户的界面

    在电商、教育、企业服务等关键领域,app的数据管理效率与系统用户体验已成为决定产品市场竞争力的核心因素。本文将为开发者提供一套从需求分析到技术落地的完整路径,助你快速构建一个高效且易用的管理类app界面。 一、厘清需求:聚焦数据与用户场景的深度融合 构建管理型App的第一步是精准把握业务本质。必须深…

    2026年9月25日 • 用户投稿
    700
  • Java ParallelStream线程池管理:定制并发与I/O优化

    Java ParallelStream线程池管理:定制并发与I/O优化Java ParallelStream线程池管理:定制并发与I/O优化Java ParallelStream线程池管理:定制并发与I/O优化Java ParallelStream线程池管理:定制并发与I/O优化

    本文深入探讨了Java ParallelStream的线程池管理,特别是如何在I/O密集型任务(如数据库查询)中定制其并发行为。我们将介绍如何通过自定义ForkJoinPool来限制ParallelStream的线程数量,并强调在处理数据库操作时,除了线程池大小,还需关注数据库连接数等关键资源,并讨…

    2026年9月25日 • 用户投稿
    100
  • UC浏览器如何查看网页加载速度_UC浏览器网页性能与速度检测方法

    UC浏览器如何查看网页加载速度_UC浏览器网页性能与速度检测方法UC浏览器如何查看网页加载速度_UC浏览器网页性能与速度检测方法UC浏览器如何查看网页加载速度_UC浏览器网页性能与速度检测方法UC浏览器如何查看网页加载速度_UC浏览器网页性能与速度检测方法

    首先开启UC浏览器的网页资源检测提示功能,进入设置→网页浏览设置→开启网页资源检测提示;然后使用开发者工具分析,输入ucdebug调出调试菜单,通过Network标签查看资源加载耗时与大小;最后借助WebPageTest或Pingdom等第三方测速平台,输入目标URL并选择测试条件,获取包含TTFB…

    2026年9月25日 • 用户投稿
    000
  • 安装swoole出现make报错的原因与解决方法

    安装swoole出现make报错的原因与解决方法安装swoole出现make报错的原因与解决方法安装swoole出现make报错的原因与解决方法安装swoole出现make报错的原因与解决方法

    安装swoole报错,错误信息如下: /Users/luzhuang/Downloads/swoole-src-4.4.3/include/swoole.h:596:10: fatal error: ‘openssl/ssl.h’ file not found#include ^~~~~~~~~~~…

    2026年9月24日 • 用户投稿
    000
  • 抖音不是好友会显示已读吗?抖音不是好友显示好友

    抖音不是好友会显示已读吗?抖音不是好友显示好友抖音不是好友会显示已读吗?抖音不是好友显示好友抖音不是好友会显示已读吗?抖音不是好友显示好友抖音不是好友会显示已读吗?抖音不是好友显示好友

    抖音,作为一款风靡全球的短视频社交平台,不仅让我们足不出户便能领略世界的精彩,也为日常生活增添了无数乐趣。在使用过程中,你是否也曾好奇过:如果和对方不是好友,抖音消息会显示“已读”吗?今天,我们就来深入探讨这个问题,揭开抖音私信功能背后的真相。 一、抖音非好友聊天会显示已读吗? 答案是:不会显示已读…

    2026年9月24日 • 用户投稿
    000
  • swoole不能支持winows吗

    swoole不能支持winows吗swoole不能支持winows吗swoole不能支持winows吗swoole不能支持winows吗

    Swoole,原本不支持在Windows下安装的,所以我们要安装Cygwin来使用。在安装Cygwin下遇到了很多坑,百度经验上的文档不是很全,所以我把自己安装Cygwin和Swoole写下来相当于对自己的沉淀吧。 首先准备工具:   (推荐学习: swoole视频教程) Cygwin 官方地址:h…

    2026年9月24日 • 用户投稿
    000
  • TPM模块在现代计算机安全中的作用是什么?

    TPM模块在现代计算机安全中的作用是什么?TPM模块在现代计算机安全中的作用是什么?TPM模块在现代计算机安全中的作用是什么?TPM模块在现代计算机安全中的作用是什么?

    TPM通过硬件级加密密钥存储和系统启动完整性验证保障安全。它在启动时逐层测量BIOS、引导程序、操作系统等组件的哈希值并记录于PCR寄存器,形成信任链;若任一环节被篡改,哈希值变化将触发安全响应。同时,TPM支持BitLocker全盘加密密钥保护、Windows Hello生物识别认证及FIDO身份…

    2026年9月24日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信