当前位置: 首页 > article >正文

【Linux篇】应用层自定义协议与序列化

个人主页孙同学_文章专栏Liunx关注我分享经验助你少走弯路应用层我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层。再谈 “协议”协议是一种 “约定”socket api的接口, 在读写数据时, 都是按 “字符串” 的方式来发送接收的. 如果我们要传输一些 “结构化的数据” 怎么办呢?其实协议就是双方约定好的结构化的数据网络版计算器例如我们需要实现一个服务器版的加法器.我们需要客户端把要计算的两个加数发过去然后由服务器进行计算最后再把结果返回给客户端.约定方案一:客户端发送一个形如11的字符串;这个字符串中有两个操作数都是整形;两个数字之间会有一个字符是运算符运算符只能是;数字和运算符之间没有空格;约定方案二:定义结构体来表示我们需要交互的信息;发送数据时将这个结构体按照一个规则转换成字符串接收到数据的时候再按照相同的规则把字符串转化回结构体;这个过程叫做序列化和反序列化我们把结构化的数据拆成字符串叫做序列化我们把一行字符串按照特定的格式拆分变成一个结构化对象叫做反序列化。序列化的作用保证报文的完整性方便报文传送。反序列化方便上层进行处理。我们把两种结构体叫做客户端与服务端约定好的协议。结论如果我们我们要进行网络通信在应用层强烈建议使用序列化和反序列化方案。至于直接穿结构体的方案除非场景特殊否则不建议。重新理解 read、write、recv、send 和 tcp 为什么支持全双工因为TCP是面向字节流的在我们的单词翻译模块在读的时候有可能读到一个单词也有可能读到半个单词。我们的buffer中有可能不是一个完整的单词所以在TCP这里我们就要对它处理。在UDP中并不存在这样的问题在UDP中要么不读报文要读就读一个完整的报文。未来我们的协议结构化字段提供序列化和反序列化方案解决因为字节流问题导致读取报文不完整的问题只处理读取网络版计算器socket封装 – 模板方法模式自定义协议设计服务器守护进程化jsoncppJsoncpp是一个用于处理JSON数据的C库。它提供了将JSON数据序列化为字符串以及从字符串反序列化为C数据结构的功能。Jsoncpp是开源的广泛用于各种需要处理JSON数据的C项目中。特性简单易用:Jsoncpp提供了直观的API使得处理JSON数据变得简单。高性能:Jsoncpp的性能经过优化能够高效地处理大量JSON数据。全面支持:支持JSON标准中的所有数据类型包括对象、数组、字符串、数字、布尔值和null。错误处理:在解析JSON数据时Jsoncpp提供了详细的错误信息和位置方便开发者调试。当使用Jsoncpp库进行JSON的序列化和反序列化时确实存在不同的做法和工具类可供选择。以下是对Jsoncpp中序列化和反序列化操作的详细介绍:安装ubuntusudo apt-get install libjsoncpp-dev Centos:sudo yum install jsoncpp-devel怎么判断我们的系统里有没有把别人的库装好呢1.我们使用别人的开源库我们在下载安装的时候安装的是别人的库当我们在使用库时是需要头文件的。所以我们在安装的时候就需要安装库的头文件和.so文件如果我们此时出现了jsoncpp的目录并且里面包含了json并且json里面包含了下面内容。就证明我们的json库就已经安装成功了。序列化序列化是指将数据结构或对象转化为一种格式以便到网络中传输或者保存在文件中。Jsoncpp提供了多种方式进行序列化。使用 Json::Value 的 toStyledString 方法优点将 Json::Value 对象直接转换为格式化的 JSON 字符串。示例#includeiostream#includestring#includejsoncpp/json/json.hintmain(){Json::Value root;root[name]张三;root[sex]男;root[age]18;std::string sroot.toStyledString();std::coutsstd::endl;return0;}小细节当我们在用json头文件的时候我们需要#includejsoncpp/json/json.h原因是我们的系统只能查找到include我们使用的stdio.h在include下面而我们今天所需要的头文件json.h需要把前导路径带上。/2.使用 Json::StreamWriter优点提供了更多的定制选项如缩进、换行符等。示例#includeiostream#includestring#includesstream#includememory#includejsoncpp/json/json.hintmain(){Json::Value root;root[name]joe;root[sex]男;Json::StreamWriterBuilder wbuilder;// StreamWriter 的工厂 std::unique_ptrJson::StreamWriterwriter(wbuilder.newStreamWriter());std::stringstream ss;writer-write(root,ss);std::coutss.str()std::endl;return0;}$./test.exe{name:joe,sex:男}使用 Json::FastWriter优点比 StyledWriter 更快因为它不添加额外的空格和换行符。示例#includeiostream#includestring#includejsoncpp/json/json.hintmain(){Json::Value root;root[name]张三;root[sex]男;root[age]18;Json::FastWriter writer;//去掉换行网络传送的数据量不久小了所以效率高std::string swriter.write(root);std::coutsstd::endl;return0;}#includeiostream#includestring#includejsoncpp/json/json.hintmain(){Json::Value root;root[name]张三;root[sex]男;root[age]18;Json::StyledWriter writer;//用\n给我们进行按行设置了可读性比较好std::string swriter.write(root);std::coutsstd::endl;return0;}反序列化反序列化是将序列化的数据重新转化为原来的数据结构或者对象。jsoncpp提供了一下进行反序列化的方法使用Json::Reader优点提供详细的错误信息和错误位置方便调试示例使用Json::CharReader的派生类不推荐在某些情况下你可能需要更精细地控制解析过程可以直接使用Json::CharReader的派生类。但通常情况下使用Json::parseFromStream或Json::Reader的parse方法就足够了。有没有一种可能就是我们的发送端只发送了一部分报文给接收端而不是一条完整的报文呢在读取的时候不就只读到了json字符串的一部分了吗还有一种情况是我们接收了三个请求但是当我们读取的时候我们只读到了一个请求和下一个请求的一半。问题因为tcp是面向字节流的。当读取方在读取的时候可能读到一个完整的请求也可能读到半个一个半五个半全都有可能发生所以read并不能保证读取报文的完整性它只保证如果数据有就读上来并不能保证报文的完整性这叫做tcp的面向字节流、谁来保证呢答案是由上层应用层程序员自己来保证我们规定客户端发过来的请求还要包含一个字段有效载荷的长度这个长度表示json串的长度为了增加区分度我们在有效长度和Json串之间加个/r/n来区别在Json串的结尾加上/r/n总结所有在命令行启动的都叫做作业作业可以由一个进程组构成也可以由多个进程组构成。作业也分为前台作业和后台作业前台作业只能由一个后台作业可以有多个守护进程 vs前台进程 vs 后台进程前台进程和后台进程属于同一个会话前台和后台相比拥有标准输入的是前台进程后台进程不拥有标准输入的使用权。守护进程也是后台进程的一种但是它是拥有独立会话的。如何把自己变成一个独立的会话成为独立会话内部的作业呢做法很简单只需要调用setsid一个进程如果调用这个setsid就会创建一个新的会话前提调用setsid的进程不能是一个进程组的组长。守护进程也是孤儿进程的一种。如果对你有帮助欢迎点赞 ⭐️收藏 关注

相关文章:

【Linux篇】应用层自定义协议与序列化

📌 个人主页: 孙同学_ 🔧 文章专栏:Liunx 💡 关注我,分享经验,助你少走弯路! 应用层 我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层。 再谈 …...

discuz所有下载版本和升级工具,2.0版本

此文章仅作参考,已无效,移步到3.0版本 下载版本: !!!升级UCenter和升级工具使用(都在里面)Discuz! X3.2 - X3.4 升级至 Discuz! X3.5 详细教程 - 程序发布 - Powered by Discuz! …...

2025河北石家庄/邯郸唐山机械互动屏设计如何重塑展厅叙事

你是否曾站在展厅里,看着墙上静态的文字与图片,心里却渴望“走进”故事里?或是带着孩子观展,却难以让他对玻璃后的文物投去好奇的一瞥?传统展厅正在经历一场静默的革命——当机械的精密与屏幕的智能相遇,展…...

AI Agent开发(3) -如何做上下文管理?

目录前言思路collection设计示例前言 书接上文 https://blog.csdn.net/roadtohacker/article/details/156004134 在Agent开发中,上下文信息的处理很重要,当用户给出新的输入的时候,如何让模型保持对旧消息的记忆?我们知道&#…...

STM32硬件I2C驱动AS5600磁编码器:从CubeMX配置到完整代码实现

STM32硬件I2C驱动AS5600磁编码器:从CubeMX配置到完整代码实现 在电机控制、机器人关节定位等需要高精度角度检测的应用场景中,磁性旋转位置传感器因其非接触式测量特性而备受青睐。AS5600作为一款12位高分辨率磁性编码器,通过I2C接口可提供精…...

基于51单片机的智能饮水机控制系统(有完整资料)

资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:T0012305C设计简介:本设计是基于51单片机的智能饮水机控制系统,主要实现以下功能:1.可通过显示屏显示当前水温和温度阈值…...

STPopup键盘处理详解:智能避让和自动重定位的终极解决方案

STPopup键盘处理详解:智能避让和自动重定位的终极解决方案 【免费下载链接】STPopup STPopup provides STPopupController, which works just like UINavigationController in popup style, for both iPhone and iPad. Its written in Objective-C and compatible w…...

Ammonite BSP协议详解:如何实现与IDE的无缝集成

Ammonite BSP协议详解:如何实现与IDE的无缝集成 【免费下载链接】Ammonite Scala Scripting 项目地址: https://gitcode.com/gh_mirrors/amm/Ammonite Ammonite作为一款强大的Scala脚本工具,通过BSP(Build Server Protocol&#xff09…...

Docker 从入门到实践:容器化你的应用

Docker 从入门到实践:容器化你的应用 在当今快速发展的软件开发领域,Docker 已成为一项革命性的技术,它通过容器化技术彻底改变了应用的开发、部署和运行方式。无论是开发者、运维工程师还是技术爱好者,掌握 Docker 都能显著提升…...

C++的std--format:C++20中的现代化字符串格式化

C的std::format:C20中的现代化字符串格式化 在C20标准中,std::format的引入彻底改变了字符串格式化的方式,为开发者提供了一种更现代化、更安全且高效的解决方案。传统的字符串格式化方法,如C风格的printf或C的iostream&#xff…...

突破网络限制:本地化部署bert_base_uncased的实践指南

1. 为什么需要本地化部署bert_base_uncased 最近在复现一个CVPR论文的代码时,遇到了一个让人头疼的问题:代码需要从Hugging Face下载bert_base_uncased预训练模型,但由于网络环境限制,始终无法成功连接。相信很多开发者都遇到过类…...

5个实用技巧掌握BOTW Save Editor GUI存档修改工具

5个实用技巧掌握BOTW Save Editor GUI存档修改工具 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI BOTW Save Editor GUI是一款专为《塞尔达传说:旷野之…...

Nordic主题高级配置:性能优化与多平台兼容性解决方案

Nordic主题高级配置:性能优化与多平台兼容性解决方案 【免费下载链接】Nordic :snowflake: Dark Gtk3.20 theme created using the awesome Nord color pallete. 项目地址: https://gitcode.com/gh_mirrors/no/Nordic Nordic是一款基于Nord北极蓝色彩方案的专…...

终极指南:东南大学论文模板的完整解决方案,高效完成毕业论文格式排版

终极指南:东南大学论文模板的完整解决方案,高效完成毕业论文格式排版 【免费下载链接】SEUThesis 项目地址: https://gitcode.com/gh_mirrors/seu/SEUThesis SEUThesis是东南大学官方认证的论文模板库,为本科生、硕士生和博士生提供一…...

实测实在Agent:打破“龙虾”落地僵局,科普Agent如何进化为企业级数字员工?

摘要: 站在2026年4月的技术拐点,以“龙虾”(OpenClaw)为代表的科普Agent已从极客圈的“命令行玩具”演变为产业界的“执行力支柱”。然而,在企业级落地过程中,API缺失导致的“系统围墙”、信创环境下的适配…...

Ai2Psd:告别矢量丢失!Illustrator到PSD无损转换的终极解决方案

Ai2Psd:告别矢量丢失!Illustrator到PSD无损转换的终极解决方案 【免费下载链接】ai-to-psd A script for prepare export of vector objects from Adobe Illustrator to Photoshop 项目地址: https://gitcode.com/gh_mirrors/ai/ai-to-psd 还在为…...

解放数字音乐:QMCDecode让加密音频转换变得简单高效

解放数字音乐:QMCDecode让加密音频转换变得简单高效 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转换…...

ARM交叉编译避坑指南:搞懂-mfloat-abi参数,告别ABI不兼容的诡异错误

ARM交叉编译避坑指南:搞懂-mfloat-abi参数,告别ABI不兼容的诡异错误 在嵌入式开发领域,ARM架构的交叉编译是每个工程师的必修课。但当你信心满满地配置好工具链,执行make命令时,突然跳出的fatal error: gnu/stubs-soft…...

Qwen2.5-VL-7B-Instruct部署教程:国产化信创环境(昇腾/海光)适配可行性分析

Qwen2.5-VL-7B-Instruct部署教程:国产化信创环境(昇腾/海光)适配可行性分析 1. 项目背景与意义 Qwen2.5-VL-7B-Instruct作为阿里通义千问推出的多模态大模型,在图文理解和交互方面表现出色。随着国产化信创环境的普及&#xff0…...

【Python原生AOT编译终极指南(2026权威实测版)】:覆盖CPython 3.14+、PyO3深度集成与生产级二进制交付全流程

第一章:Python原生AOT编译演进全景与2026技术定位Python长期以解释执行和字节码(.pyc)为核心运行范式,但自2021年CPython 3.11引入更快的PEP 659自适应解释器起,AOT(Ahead-of-Time)编译路径开始…...

MySQL 索引实战详解:为什么B+类型的索引查询更快

MySQL 索引实战详解:为什么B类型的索引查询更快 在MySQL数据库实战中,索引是提升查询性能的核心手段——无需逐行扫描全表,通过索引可快速定位目标数据,将千万级数据的查询耗时从分钟级压缩到毫秒级。某电商平台用户表(5000万数据…...

Pixel Aurora Engine效果展示:极光视觉系统UI与生成图像色调自动匹配机制

Pixel Aurora Engine效果展示:极光视觉系统UI与生成图像色调自动匹配机制 1. 像素极光引擎概览 Pixel Aurora Engine是一款融合复古美学与现代AI技术的创意工具,它将扩散模型的高质量图像生成能力与8-bit像素艺术风格完美结合。这款"虚拟游戏机&q…...

为什么你的C# 13主构造函数无法单步执行?微软Roslyn团队2024Q2调试协议变更详解(首批实测报告)

第一章:为什么你的C# 13主构造函数无法单步执行?C# 13 引入的主构造函数(Primary Constructor)语法简洁优雅,但调试时却常出现断点失效、F10/F11 无法单步进入等问题。根本原因在于:**主构造函数不生成独立…...

MySQL 实战进阶:从单表优化到分布式数据库适配

MySQL 实战进阶:从单表优化到分布式数据库适配 在企业业务发展的不同阶段,MySQL 的应用场景从简单的单表查询,逐步演进到高并发、海量数据的处理场景。多数开发者在入门 MySQL 后,容易陷入“会用但不会优”的困境——单表数据量激…...

LoRA训练助手GPU算力优化:支持FP16/INT4双精度推理,显存占用降低58%

LoRA训练助手GPU算力优化:支持FP16/INT4双精度推理,显存占用降低58% 1. 为什么需要GPU算力优化 如果你尝试过训练自己的AI绘画模型,一定遇到过这样的困扰:生成训练标签时显存爆满、推理速度慢、甚至因为资源不足而中断进程。传统…...

如何快速实现FastAPI国际化:多语言支持完整指南

如何快速实现FastAPI国际化:多语言支持完整指南 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi FastAPI作为一款高性能、易…...

腾讯混元OCR网页推理快速搭建:新手友好型部署指南与问题汇总

腾讯混元OCR网页推理快速搭建:新手友好型部署指南与问题汇总 1. 认识腾讯混元OCR 腾讯混元OCR是一款基于混元原生多模态架构的轻量级文字识别专家模型。作为一款仅1B参数的轻量化模型,它在多项OCR任务中取得了业界领先的成绩。这个网页推理版本将强大的…...

7个强力修复方案:解决Windows更新故障的创新方法

7个强力修复方案:解决Windows更新故障的创新方法 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool Windows更新故障是…...

LangFlow可视化优势:拖拽式AI流水线构建实操案例

LangFlow可视化优势:拖拽式AI流水线构建实操案例 1. 引言:告别代码,用拖拽构建AI应用 如果你对AI应用开发感兴趣,但一看到复杂的代码和框架就头疼,那么LangFlow可能就是为你量身打造的工具。想象一下,构建…...

window 10 主机安装ubuntu22 系统

准备工作 下载ubuntu22镜像 使用ubuntu_server_220405时,当在/etc/netplan/50-cloud-init.yaml文件里编辑网卡信息 network:version: 2renderer: networkdethernets:eth0:dhcp4: noaddresses: - 172.20.10.2/24routes:- to: defaultvia: 172.20.10.1nameservers:ad…...