• C++服务端消息处理流程


    C++服务端消息处理流程

    效果图

    为什么要进行编解码?

    • 由于网络中传输的是数据流,从而无法保证每次收到的数据包是否为一个完整的数据包。

      因此需要进行编解码,或者说在编解码之前如果不为一个完整的数据包,应该进行拼包操作,而且如果发送端一次性发送多个数据包,也可以进行凭借编解码进行逐一解析操作。

      在编解码之前一般还需要进行一个校验操作(比如我们规定前面2-n个字节必须为某一标识等),用于快速校验接收的数据包是否是我们所需的,这样可以高效利用服务端资源。

    编解码是什么?

      编解码的对象是一堆二进制数据流,**对二进制数据流按照一定的规律进行处理,我们称之为编解码。**从这堆数据流中截取完整的数据包交给业务逻辑层进行处理(解码)。而业务逻辑层下发发送指令时,需要将指令或者数据包进行打包(编码)。一般情况下,数据包中应包含消息头、消息长度、协议号(指令类型)、协议体(具体内容)等。

      如下面所示的图例(示例):

    效果图

      即不管我们是客户端发送数据还是服务端接受数据,我们只接收(识别)这种类型的数据包。

      注意,在编解码的过程中可能需要对数据包进行压缩/解压缩,以及为了应对网络环境,还需对数据包进行加密/解密步骤。

    序列化/反序列化

      序列化/反序列化实际上就是将内存中的实例对象(类/结构体)转换为二进制数据(序列化),或者将二进制数据转换为内存中的实例对象(类/结构体)(反序列化)的过程。

      在这个过程中如果我们客户端和服务端是使用同一种开发语言进行开发的,那么我们无需考虑其它问题,但是一般情况下客户端和服务端的开发语言可能不相同,那么这时我们需要用到一些工具来解决开发语言的问题。

      当前较为常用的工具包括ProtoBufJSONBSONMsgPackFlatBuffersXML等。

    协议处理

      在该过程我们主要是对业务逻辑进行处理分发。

  • 相关阅读:
    PyTorch使用快速梯度符号攻击(FGSM)实现对抗性样本生成(附源码和数据集MNIST手写数字)
    序列化和反序列化
    JAVA NIO深入剖析
    小程序版本审核未通过,需在开发者后台「版本管理—提交审核——小程序订单中心path」设置订单中心页path,请设置后再提交代码审核
    服务器主机管理系统是什么
    MySql一条 SQL 的生命周期
    设计模式java版本阅读笔记 一结构型
    zabbix监控实战2
    JointJS+新的MindMap应用程序
    并发编程 --- 信号量线程同步
  • 原文地址:https://blog.csdn.net/qq135595696/article/details/126167819