【Linux】认识“协议“序列化和反序列化

目录

前言

1 应用层

2 在谈协议

3 序列化和反序列化

4 网络版计算器

4.1 指定协议

request结构体

 response结构体

4.2 服务端编写

4.3 客户端的编写

5 Json for C++ 的序列化和反序列化使用样例


前言

之前的socket编程,都是在通过系统调用层面,如今我们来向上打通计算机网络。认识应用层的协议和序列化与反序列化

1 应用层

我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层。我们在应用层使用的数据形式一般都是结构体或者对象,而对于网络来说,传输的数据一般都是字节流的

2 在谈协议

为了使数据在网络上能够从源到达目的,网络通信的参与方必须遵循相同的规则,我们将这套规则称为协议(protocol),而协议最终都需要通过计算机语言的方式表示出来。只有通信计算机双方都遵守相同的协议,计算机之间才能互相通信交流。

协议是一种 "约定". socket api的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接收的. 如果我们要传输一些"结构化的数据" 怎么办呢?我们通过实现网络版的计算机来深入理解协议的作用。

分析:

  • 网络传输的数据也可以是结构体对象,但是最好不要,因为结构体在不同的平台中,有着不同的对齐规则,这样就会导致同一个结构体对象字节流在不同的平台中解析出来的结果不一样;如果想要解析结果需要一样,这样就要求主机和相应的操作系统需要高度的一样,显然,这是不可能的。所以,在网络传输的过程中,需要将结构体序列化成一个大的字符串,为了拿到消息,对于从网络中得到的数据,需要进行反序列化得到相应的信息!
  • 协议本质:对方约定好某种格式的数据,常见的就是结构体或者类来进行表达;
  • 序列化的作用:方便网络进行通信;
  • 反序列化作用:方便上层来设置和获取数据,就是通过. ->操作符来进行读写数据
  • 序列化和反序列化并只是单单将结构体的数据变成一串大的字符串,为了方便提取和标识数据,需要加上相关的分割符号和对应的报头。

现在我们通过自我编写协议+使用别人的来深入理解协议!

3 序列化和反序列化

序列化和反序列化:

  • 序列化是将对象的状态信息转换为可以存储或传输的形式(字节序列)的过程。
  • 反序列化是把字节序列恢复为对象的过程。

OSI七层模型中表示层的作用就是,实现设备固有数据格式和网络标准数据格式的转换。其中设备固有的数据格式指的是数据在应用层上的格式,而网络标准数据格式则指的是序列化之后可以进行网络传输的数据格式。

序列化和反序列化的目的

  • 在网络传输时,序列化目的是为了方便网络数据的发送和接收,无论是何种类型的数据,经过序列化后都变成了二进制序列,此时底层在进行网络数据传输时看到的统一都是二进制序列。
  • 序列化后的二进制序列只有在网络传输时能够被底层识别,上层应用是无法识别序列化后的二进制序列的,因此需要将从网络中获取到的数据进行反序列化,将二进制序列的数据转换成应用层能够识别的数据格式。
     

我们可以认为网络通信和业务处理处于不同的层级,在进行网络通信时底层看到的都是二进制序列的数据,而在进行业务处理时看得到则是可被上层识别的数据。如果数据需要在业务处理和网络通信之间进行转换,则需要对数据进行对应的序列化或反序列化操作。

4 网络版计算器

此时服务端每次从网络当中获取到的就是一个完整的请求数据,客户端常见的“打包”方式有以下两种。

将结构化的数据组合成一个字符串

约定方案一:

  • 客户端发送一个形如“1+1”的字符串。
  • 这个字符串中有两个操作数,都是整型。
  • 两个数字之间会有一个字符是运算符。
  • 数字和运算符之间没有空格。

客户端可以按某种方式将这些结构化的数据组合成一个字符串,然后将这个字符串发送到网络当中,此时服务端每次从网络当中获取到的就是这样一个字符串,然后服务端再以相同的方式对这个字符串进行解析,此时服务端就能够从这个字符串当中提取出这些结构化的数据。

定制结构体+序列化和反序列化

约定方案二:

  • 定制结构体来表示需要交互的信息。
  • 发送数据时将这个结构体按照一个规则转换成网络标准数据格式,接收数据时再按照相同的规则把接收到的数据转化为结构体。
  • 这个过程叫做“序列化”和“反序列化”。

客户端可以定制一个结构体,将需要交互的信息定义到这个结构体当中。客户端发送数据时先对数据进行序列化,服务端接收到数据后再对其进行反序列化,此时服务端就能得到客户端发送过来的结构体,进而从该结构体当中提取出对应的信息。

4.1 指定协议

规定计算式的表达式的有效载荷为: 10 + 20
 

request结构体

struct Request{Request() = default;Request(int x, int y, char op): _x(x), _y(y), _op(op){}public:int _x;int _y;char _op;};

 response结构体

struct Response{Response(int result = 0, int code = 0): _result(result), _code(code){}int _result;int _code;};
}

4.2 服务端编写

  1. socket()打开网络文件
  2. bind()进行绑定端口和IP地址
  3. listen()监听
  4. accept()接受客户,接着创建新的线程给客户提供相应的服务

以上都是socket编程的流程,已经在上一篇博客详细介绍了,便不再介绍,现在我们来重点介绍如何提供服务的!

服务流程:

        1. 接受数据

                1.1 检查收到的数据是否是完整一条信息

                1.2 去掉报头,得到有效载荷

                1.3 反序列化

        2. 处理任务

                2.1 调用上层函数,得到结果的结构体

                2.2 将相应的结构体进行序列化

        3. 发送数据

                3.1 添加报头

                3.2 将数据发送到网络

数据读取与发送:添加报头和去掉报头

4.3 客户端的编写

5 Json for C++ 的序列化和反序列化使用样例

 

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

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

相关文章

使用gewe框架进行微信群组管理(一)

友情链接:geweapi.com 点击访问即可。 管理员操作 小提示: 添加、删除、转让多个wxid时仅限于添加/删除管理员,1添加 2删除 3转让 请求URL: http://域名地址/api/group/admin 请求方式: POST 请求头&#xff1a…

APISpace 快递物流地图轨迹查询API

APISpace 的 快递物流地图轨迹查询API,支持全球全国的超过1500的外快递公司的物流地图轨迹查询,并预估送达时间,实时展示包裹运输过程中的轨迹。包括顺丰、圆通、申通等主流快递公司。自动识别快递公司及单号,实时查询&#xff0c…

快递查询API破解

目前市面上的API基本都是收费,官网或百度上能提供一些查询功能,但查询量多的话,会被限制,出现各种验证。 不经意中发现快递100小程序上的接口并没有限制。 不多说,上破解步骤 一.使用Fiddler抓取小程序的接口&#…

后端调用阿里云快递API接口--后端部分

这是小练手,调用接口要买,一般都会有一次机会0元100次 为了节约调用接口的次数 后端部分:(快递接口不同的话会出错) 工具类 1.HttpUtils import org.apache.commons.lang.StringUtils; import org.apache.http.Ht…

小米笔记本 Pro 2022官宣发布时间 将于7月4日正式发布

在前面就有消息曝光了小米笔记本 Pro 2022的相关信息,但关于他的发布时间知道的人并不是很多,而在近日,小米官方官宣了小米笔记本 Pro 2022的发布时间,将于7月4日正式发布,下面来看看详细内容。 小米笔记本 Pro 2022官…

小米上市,现实很残酷,并没有那么多人暴富

小米上市,现实很残酷,并没有那么多人暴富 岳京杭 公众号:中产之路 本文首发于微信公共号: 中产之路 我的最新思考都会更新这里,你不妨关注一下 小米上市,那些年错过了的可以暴富的工作机会 一文中京杭君感叹…

【数学建模】逻辑回归算法(Logistic Resgression)

逻辑回归算法 简介逻辑回归与条件概率绘制sigmoid函数 简介 逻辑回归算法是一种简单但功能强大的二元线性分类算法。需要注意的是,尽管"逻辑回归"名字带有“回归”二字,但逻辑回归是一个分类算法,而不是回归算法。 我认为&#xff…

Dynamics 365 字段类型介绍

实体的本质是数据库表,所以每种字段类型都有自己对应的数据库类型。不同的类型也有自己不同的展示界面。 1 字段类型总览 Dynamics365中支持的类型如图,其在C#中对应的类型在括号中 文本类型:单行文本(string)、多行文本(string) 数字类型:整数(int)、浮点数(double)、十…

苹果复兴_类型复兴的故事:来自Type West的经验教训

苹果复兴 Last Fall, I began the 去年秋天,我开始 在旧金山的 Type West program at the Letterform档案库中 Letterform Archive in San Francisco. For those of you who don’t know, the Letterform Archive is creative heaven — a type nerd’s letter ar…

CTF·Crypto·古典密码大全

CTF赛事中Crypto里较为齐全的古典密码收录 共计39种密码及多个对应解密脚本 若有纰漏,烦请指出 NEFU-NSILAB下密码手总结,首发于校内bbs论坛 您也可以点击我的博客观看 0.究极奥义 解密方式 根据题目、描述、提示、图片锁定主题,找到主题下…

Tomcat juli 应用日志隔离原理解析

背景 最近在读 博多-舍费尔 著的《财务自由之路Ⅱ》,财务自由的确是一个很具诱惑力的目标,对于我这个连水果自由都没达到的人来说(PS:公司楼底下有一个菜鲜果美超市,随便什么水果都是十几块一斤,普通的苹果…

二十九岁,刚读完了财富启蒙读物《小狗钱钱》

01、小狗钱钱 直白点说吧,我读《小狗钱钱》最主要目的是,不能在创造财富方面拖了女儿的后腿——假如女儿像这本书的小女主一样要理财,做为父母,咱不能嘲笑、不能阻拦。 之前已经读过了《小狗钱钱》的作者博多舍费尔的《财务自由…

《财务自由之路》读书笔记

目录 第一章、你真正想要的是什么第二章、责任意味着什么第三章、100万欧元是难以企及的奇迹吗第四章、为什么没有更多的人变得富有第五章、你关于金钱的想法是什么第六章、债务第七章、如何增加自己的收入第八章、储蓄—支付自己第九章、复利的奇迹第十章、你为什么必须饲养金…

程序员别再迷茫,赚钱,方法比你想的更多

每次打开公号,扑面而来一阵阵焦虑: 95后毕业3个月就买房,你的同龄人正在抛弃你 毕业3年,年薪超100万:赚钱,是一种修行 一线城市财务自由门槛2.9亿,看看你还差多少 说来说去就是,牛人…

ラーメン用語10選

店内には開花楼の麺箱。およそ10分で着丼。開花楼のつけ麺ならば、太麺かと思いきや、ストレートの中太麺で、しかも加水率高めと意外な展開だ。 上のレビューの意味が、ツルっと頭に入ってきますでしょうか?ヘビーユーザーが多いラーメンファ…

bugku-writeup-Crypto-你喜欢下棋吗

题目:你喜欢下棋吗 01—棋盘码解码Polybius Square Cipher 使用波利比奥斯方阵密码加密/解密工具http://www.atoolbox.net/Tool.php?Id913&accsdn,需要数字两个一组改变前后位置才可以得到正确的密码,得到密码之后输入密码,打…

奔向财富自由之路的10条建议

这是山猫的第31篇原创 [德国] 博多舍费尔 著 01 心态开放 对待金钱要有个开放的心态,谈钱不伤感情,不谈钱饿肚子,你选择哪一个,在我们能力范围之内,要大胆追求财富,至少这个世界绝大多数人还没到达财富自由…

《财务自由之路》博多.舍费尔 篇一,关于金钱和财务自由

本章讨论对于金钱的观点,以及欲获取金钱所要做的思想准备 人世间的苦难大部分都是钱不够用造成的 tip: 本书介绍的,变得富有的其中一种途径 储蓄一定资金使用储蓄进行投资提高自己的收入从加薪中提取一定比例再储蓄 真正想要的是什么 我们每个人的经历…

财富自由之路-博多.舍费尔

* 博多.舍费尔* 德国理财大师,1960生于德国。欧洲知名亿万富翁 * 核心内容* 穷人和富人的差距主要体现在对待财富的观念和原则上 * 改变方式* 明确定义:明确数字,用笔记录下来,转化为画面。在潜意识下是一个具体的场景&#xff0c…

[oeasy]python0041_teletype历史_博多码_shift_capslock_字符数字切换_gear

teletypewriter 历史 回忆上次内容 上次见到了一个真的机械打字机 感受到了蒸汽朋克的时代背景 上上次区分了一些概念 terminal终端,电脑连线最终的端点TeleTYpewriter,电传打印机,终端硬件shell,终端硬件基础上的软件壳子Conso…