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

文章目录

  • 一、应用层
    • 1、协议
    • 2、序列化 && 反序列化
    • 3、通过Json库进行数据的序列化 && 反序列化
      • Json::Value类
      • Json::Reader类
      • Json::Writer类
  • 二、为什么read、write、recv、send和Tcp支持全双工?
    • 发数据的本质:
    • tcp支持全双工通信的原因:
    • 为什么IO函数要阻塞?
    • 其他:
      • 因为面向字节流,可能读取不了一个完成的请求,那如何保证在主机中保证处理的是一个完整的请求?
      • 因为面向字节流,可能读取不了一个完成的请求,那如何保证在主机中保证处理的是一个完整的请求?

一、应用层

1、协议

  • 协议本质是一种约定。
  • 协议就是双方约定好的结构化数据。

2、序列化 && 反序列化

在用户在网络中发送的信息类型不都是字符串,有可能是整型,浮点数,自定义类型等等,将不同的类型通过网络发送给另外一个客户端,然后进行识别明显是比较困难的,为了解决这种事情,我们把发送的消息进行序列化和反序列化来对信息进行封装和解封。

image-20240925190644793

3、通过Json库进行数据的序列化 && 反序列化

Json::Value类

  • operator[]:通过键名或索引访问JSON对象中的元素。
  • append:向JSON数组中添加元素。
  • asStringasIntasFloatasBool等:将Json::Value对象转换为不同的数据类型。
  • type():获取Json::Value对象的类型。
    // 创建一个Json::Value 对象Json::Value root;// 通过键值访问Json对象元素,如果没有键值对应的元素则新建root["name"] = "zhangsan";root["age"] = 18;root["year" ] = 2024;// 向数组中添加键值对// 创建一个Json::Value对象,并初始化为数组类型Json::Value root(Json::arrayValue);// 使用append方法向数组中添加元素root.append("Hello"); // 添加一个字符串root.append(123);     // 添加一个整数root.append(45.67);   // 添加一个浮点数// 将Json::Value对象转换为不同的数据类型// asString、asInt、asFloat、asBool等int age = root["age"].asInt();std::string name = root["name"].asString();// 获取Json::Value对象的类型// Null:表示JSON中的null值。// String:表示JSON中的字符串值。// Number:表示JSON中的数字值,这通常包括整数和浮点数。不过,在某些实现中,可能会进一步区分整数(Int)和浮点数(Float或Double)。// Boolean:表示JSON中的布尔值(true或false)。// Array:表示JSON中的数组,数组可以包含多个JSON值,这些值的类型可以不同。// Object:表示JSON中的对象,对象由键值对组成,其中键是字符串,值是任意的JSON值。// ...Json::ValueType type = root.type();// 输出,测试 Json::FastWriter writer;std::string str = writer.write(root);std::cout << str << std::endl;

Json::Reader类

用于将JSON格式的字符串解析为Json::Value对象。

  • parse:解析JSON字符串,并将其存储在Json::Value对象中。
// JSON格式的字符串std::string jsonStr = R"({"name": "John Doe", "age": 30, "is_student": false, "scores": [90, 85, 95]})";// 创建一个Json::Value对象来存储解析后的JSON数据Json::Value root;// 创建一个Json::Reader对象来解析JSON字符串Json::Reader reader;// 使用parse方法解析JSON字符串bool parsingSuccessful = reader.parse(jsonStr, root);// 检查解析是否成功if (!parsingSuccessful){// 如果解析失败,输出错误信息std::cout << "Failed to parse JSON"<< std::endl<< reader.getFormattedErrorMessages() << std::endl;return 1;}// 解析成功后,可以使用root对象来访问JSON数据std::string name = root["name"].asString();int age = root["age"].asInt();bool isStudent = root["is_student"].asBool();// 访问数组中的元素Json::Value scores = root["scores"];for (int i = 0; i < scores.size(); ++i){std::cout << "Score " << i + 1 << ": " << scores[i].asInt() << std::endl;}// 输出一些基本信息std::cout << "Name: " << name << std::endl;std::cout << "Age: " << age << std::endl;std::cout << "Is Student: " << std::boolalpha << isStudent << std::endl;

Json::Writer类

  • 功能:Json::Writer是一个抽象基类,用于将Json::Value对象序列化为JSON格式的字符串。通常不会直接使用,而是使用其子类如Json::StyledWriter或Json::FastWriter。
  • 子类
    • Json::StyledWriter:生成格式化的JSON字符串,易于阅读。
    • Json::FastWriter:生成紧凑的JSON字符串,没有额外的空格和换行符。
    Json::Value root;root["name"] = "zhangsan";root["age"] = 18;root["year"] = 2024;Json::FastWriter fast_write;Json::StyledWriter styledwriter;std::string str1 = fast_write.write(root);std::cout << str1 << std::endl;std::cout << "------------------------------" << std::endl;std::string str2 = styledwriter.write(root);std::cout << str2 << std::endl;

image-20240925235011003

二、为什么read、write、recv、send和Tcp支持全双工?

image-20240925191138356

  • 一个文件描述符fd,代表一个连接。一个连接,有两个缓冲区,发送缓冲区和接收缓冲区
  • read、write、send、recv**本质都是拷贝函数**。

发数据的本质:

从发送方的发送缓冲区把数据通过协议栈和网络拷贝给接收方的接收缓冲区。

tcp支持全双工通信的原因:

有两个缓冲区,读写不受到冲突。

(传输控制协议!什么时候发?发多少?出错了怎么办?均有tcp决定。)

为什么IO函数要阻塞?

本质就是在维护同步关系!

其他:

  • 网络层、传输层 属于 os。
  • 面向字节流:客户端发的,不一定全部是服务器收的。— 也就是说客户端可能发送的不是一个完整报文

因为面向字节流,可能读取不了一个完成的请求,那如何保证在主机中保证处理的是一个完整的请求?

  • 网络层、传输层 属于 os。
  • 面向字节流:客户端发的,不一定全部是服务器收的。— 也就是说客户端可能发送的不是一个完整报文

因为面向字节流,可能读取不了一个完成的请求,那如何保证在主机中保证处理的是一个完整的请求?

手动分割完整的报文。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1550006.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

java计算机毕设课设—超级玛丽游戏(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; 资源获取方式在最下方 java计算机毕设课设—超级玛丽游戏(附源码、文章、相关截图、部署视频) 超级玛丽游戏是一款经典的平台游戏&#xff0c;自1985年推出以来&#xff0c;已成为全球玩家心目中的经典之作。玩家操控玛丽奥在多样化的关卡中进行冒…

【综合性渗透利器】- TscanPlus

如果你在寻找一款轻量级、实用且开源的漏洞扫描工具&#xff0c;那么 TscanPlus 绝对值得一试。这款工具由 TideSec 团队打造&#xff0c;以其简洁、高效、易用的特点&#xff0c;广受好评&#xff0c;目前在github上拥有1.5k star。 为什么推荐 TscanPlus&#xff1f; 无论你…

利用ChatGPT实现的生成式人工智能自动化控制系统

一、引言 随着信息化与智能化时代的到来&#xff0c;人工智能&#xff08;AI&#xff09;技术迅猛发展&#xff0c;正在深刻地重塑各行业的运营模式。在这一背景下&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;以其卓越的创造力和广泛的应用潜力&#xff…

一种多版本、多人并行开发GIT分支管理规范

首发公众号&#xff1a; 赵侠客 引言 作为开发者每天在写代码的同时也在写BUG&#xff0c;所以一方面需要开发新的需求&#xff0c;另一方面还要填自己以前挖的坑。目前主流程序员都在使用GIT来管理自己的代码&#xff0c;当GIT仓库有多人维护或者项目有多个版本同时迭代开发时…

Axios使用cancel token取消请求

在一个vue项目开发的过程中&#xff0c;遇到一个需要中断文件上传的需求&#xff0c;当我利用axios的cancel token实现中断请求的功能之后&#xff0c;想要再次发送post请求&#xff0c;却发现axios直接返回了reject。 问题复现 当我执行upload方法时&#xff0c;文件能够正常…

PC端微信小程序如何调试?

向往常一样运行开微信小程序开发者工具 如果只弹出pc端小程序&#xff0c;没有出现调试的界面&#xff1a;点击胶囊按钮的三个…选择重新进入小程序 即可依次展开相应的功能调试&#xff0c;改完代码没反应再刷新看看&#xff0c;再没反应就再次重新点击编译并自动调试。

中国AIGC最值得关注企业产品榜单揭晓!首份应用全景图谱发布

“你好&#xff0c;新应用&#xff01;” 站在大模型落地元年&#xff0c;是时候喊出这句话了。 从软件APP、智能终端乃至具身智能等等&#xff0c;AIGC开始席卷一切。 大模型玩家、互联网巨头、终端厂商、垂直场景玩家纷纷入场&#xff0c;办公、创作、营销、教育、医疗领域…

电瓶车常见电压数据 48v/60v/72v 说明

常见电压数据 48v/60v/72v的区别 48v 基本属于电动自行车&#xff0c;适合10公里内的骑行&#xff0c;速度慢&#xff0c;25公里/时&#xff0c;适合老年人60v 电轻摩&#xff0c;不能带人&#xff0c;适合远距离出行72v 适合外卖小哥 电压和电机功率 48v 电动车通常配备400…

A: 数数(牛客练习赛129)

题目链接: A-数数_牛客练习赛129 (nowcoder.com) 题目描述: 样例输入: 5 样例输出&#xff1a; 0 思路分析&#xff1a; 直接求偶数是困难的&#xff0c;之前好像听过&#xff1a;任何一个大于1的自然数N&#xff0c;都可以唯一分解成有限个质数的乘积。那么就是间接的去做&a…

STM32F103C8----3-2 LED流水灯(跟着江科大学STM32)

一&#xff0c;电路图&#xff08;接线图&#xff09; 面包板的的使用请参考&#xff1a;《面包板的使用_面包板的详细使用方法-CSDN博客》 二&#xff0c;目的/效果 三&#xff0c;创建Keil项目 详细参考&#xff1a;《STM32F103C8----2-1 Keil5搭建STM32项目模版&#xff…

每天3分钟,彻底弄懂神经网络的优化器(三)Momentum

前面从最初的SGD开始&#xff0c;介绍SGD的算法细节&#xff0c;以及其在深度神经网络中的劣势&#xff0c;本文引入Momentum算法&#xff0c;解决SGD的一些问题。 1. Momentum算法的提出 动量&#xff08;Momentum&#xff09;方法最初由B.T.Polyak在1964年提出。这一方法被…

国庆节快乐|中国何以成为中国

华夏之土&#xff0c;广袤无垠&#xff1b;中华之史&#xff0c;源远流长。自古以来&#xff0c;中原大地物华天宝&#xff0c;人杰地灵&#xff0c;遂成一国&#xff0c;是谓中国。然中国之所以为中国&#xff0c;非徒地大物博、历史悠久也&#xff0c;更有其深厚之文化底蕴、…

改善大模型 RAG 效果:结合检索和重排序模型

最近这一两周不少大厂都已经开始秋招面试了。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解惑答疑&am…

苹果退出OpenAI融资谈判

&#x1f989; AI新闻 &#x1f680; 苹果退出OpenAI融资谈判 摘要&#xff1a;据《华尔街日报》报道&#xff0c;苹果公司已决定不参与OpenAI的新一轮融资&#xff0c;计划筹集约65亿美元&#xff08;约454.98亿元人民币&#xff09;。OpenAI正进行从非营利到盈利性公司的转…

【图解秒杀系列】秒杀技术点——隔离、熔断、限流、降级

【图解秒杀系列】秒杀技术点——隔离、熔断、限流、降级 隔离熔断限流降级 隔离 隔离的思想其实就是舱壁模式&#xff0c;这在Docker中有所体现。在Docker中&#xff0c;容器与容器间互相隔离互不影响。一个容器有它独立的与外界隔离的环境与资源&#xff0c;包括CPU、内存等&…

AI读教链《关于美国、中国和BTC的三个超级变量​》

这篇文章探讨了美国、中国及比特币&#xff08;BTC&#xff09;当前经济形势中的三个超级变量&#xff0c;强调了对经济状况的重新审视。 美国经济与衰退&#xff1a;尽管有观点认为美国经济正在衰退&#xff0c;文章指出这取决于如何定义衰退。美股市场的市盈率处于高位&#…

实用工具推荐---- PDF 转换

直接上链接&#xff1a;爱PDF |面向 PDF 爱好者的在线 PDF 工具 (ilovepdf.com) 主要功能如下&#xff1a; 全免费&#xff01;&#xff01;&#xff01;&#xff01;

低功耗4G模组Air780E的串口通信指南

今天我们来讲解低功耗4G模组Air780E的串口通信的基本用法&#xff0c;合宙的小伙伴们&#xff0c;学起来吧&#xff01; 一、硬件准备 780E开发板一套&#xff0c;包括天线、USB数据线。 USB转TTL工具或线&#xff08;例如ch340、ft232&#xff09; PC电脑&#xff0c;串口…

【系统方案】智慧城市大数据平台建设方案(Word)

第1章 总体说明 1.1 建设背景 1.2 建设目标 1.3 项目建设主要内容 1.4 设计原则 第2章 对项目的理解 2.1 现状分析 2.2 业务需求分析 2.3 功能需求分析 第3章 大数据平台建设方案 3.1 大数据平台总体设计 3.2 大数据平台功能设计 3.3 平台应用 第4章 政策标准保障体系 4.1 政策…

零基础学习AI大模型,手把手带你从入门到实践!看过的已经月入6w了!

引言&#xff1a; 在2024年这个充满挑战的就业市场环境下&#xff0c;许多人都在寻求掌握一门技术以增强自己的竞争力&#xff0c;但往往不知道该选择学习什么。今年&#xff0c;学习人工智能无疑是一个明智的选择。 对于外行人而言&#xff0c;AI可以被理解为一种模拟人类智…