• “再谈”协议



    协议是一种约定,但是对于socket api套接字中的数据都是通过字符串进行传输的,那么如果我们要传入的是一个结构化的数据,应该怎么进行操作呢?

    网络版计算器

    如果我们要指定一个计算器,那么客户端就应该将两个数据和一个运算符号发给服务器,服务器进行解析后计算后将最终数据发给客户端。

    例如:我们要指定一个加法器,那么客户端就应该给服务端发两个数据和一个“+”符号,那么对于服务器,他肯定有自己的一个协议,这个协议就是约定方案,约定了客户端在请求服务端的时候,应该将数据以什么方式发送,数据最终以什么方式返回来,只有这样的操作,客户端才能得到客户们想要的结果。

    约定方案

    例如:我们要制定一个加法器,那么我们应该又以下一些协议
    约定一:

    • 发送过来的数据是有顺序的,并且为两个数字中间一个加法运算符。例如:“1+2”。
    • 发送过来的数据必须是整数,运算符必须是+。
    • 数字与运算符中间没有空格。

    约定二:

    • 发送过来的数据不用按顺序发送,用结构体进行封装即可。
    • 发送过来的数据必须是整数,运算符必须是+。

    上面只是写了约定的一部分,因为对于我们实现一个加法器也不需要多少约定。
    注意:不管是约定一还是约定二,它们的终极目标就是制造一个统一的事件(针对一件事情),也就是为了让客户发过来的东西,服务器能知道对发来的数据进行如何正确的处理(也就是服务器可以正确解析)。

    加法服务器的简单实现

    对于加法器的实现,我们使用的结构体来发送数据,因为对于结构体,它可以将数据和运算符分开,可以让我们非常容易的就解析到数据和运算符。
    封装一个加法服务器的套接字类,如下:
    在这里插入图片描述
    服务器实现如下:
    在这里插入图片描述
    客户端的实现如下:
    在这里插入图片描述
    可以看见,在进行信息的传送时,用的是结构体,因为结构体可以直接将我们要传递的数据和符号进行分开,可以使服务器更好的去解析,这也就是序列化和反序列化的作用。

    序列化和反序列化

    上面我们提到了序列化和反序列化,那么它俩到底是什么意思呢?

    1.序列化:将对象转换成为字节序列的过程。
    2.反序列化:将字节序列恢复成对象的过程。

    说白了,序列化和反序列化也就像是一个规定一样,可以让服务器接收到数据,并且对这些数据进行正确的解析,但是它们也有一些重要的作用:

    • 序列化:按照指定的格式将多个对象进行组织成为可持久化存储或者数据传输的二进制数据串。(保证对象的完整性,而对于有序字节流是为了防备在网络上传输或者保存在本地文件中)
    • 反序列化:将二进制数据串,能够根据指定的格式进行解析得到多个数据对象。

    注意:对于序列化形式,他有一个考量

    • 传输性能:序列化出来的二进制数据串要越短越好。
    • 解析性能:序列化与反序列化的过程越简单越好。

    上述我们使用的是结构体,因为根据结构体的结构特性,成员变量的赋值就能实现数据在内存中的组织。但是他是有缺点的,因为对于不同的平台,位段的使用可能不一致,字节对齐也可能不一致。

    3.序列化的优点:

    • 永久性保存对象:将对象按照二进制序列的形式存储在硬盘上,不仅可以减少空间,而且即便是当前因为某些原因中断了虚拟机的工作时,硬盘上的序列也不会受到影响,等待下次开机依然可以按照反序列化解析到对象。
    • 序列化成为字节流形式的对象可以进行网络传输。
    • 通过序列化可以在进程间传递对象。
  • 相关阅读:
    医美健康这类在医疗行业的推广要怎么做?
    伦敦银交易所数据全面吗?
    spring-Bean管理-springboot原理-Maven高级
    Composition API (setup)&& Options API
    枚举与#define 宏的区别
    y149.第八章 Servless和Knative从入门到精通 -- Flow(十三)
    多色柱状图让数据区分更明显更醒目
    Django与Ajax
    0106极限存在准则两个重要的极限-函数与极限
    SLIP 和mac 帧都用在哪里
  • 原文地址:https://blog.csdn.net/xiaobai_hellow/article/details/125380992