首页 > 其他分享 >如何设计一个通信协议

如何设计一个通信协议

时间:2024-10-22 16:59:38浏览次数:1  
标签:文件 封装 protobuf proto 通信协议 命令 设计 如何

1. 网络层次

1.1具体层次以及封装

Snipaste_2024-10-22_15-30-30

  • 封装的协议结构一般是协议头+数据。

2. 网络通信存在问题

2.1 设计协议时,边界问题如何处理

场景以及问题:在TCP流式传输中,流式传输也就是一端只关心向管道发送数据,另外一边只要管道存在数据就接收数据。一个客户端发送N个100字节的消息,此时服务器接收数据可以每次读取100字节。但是当客服端每次发送的数据长度不一样的时候,比如发送200字节、500字节,此时如何对接收的数据进行一个拆分。

解决:

根据标识去拆分数据得到完整的一个消息。关键在于一个消息的起始边界的判定。

2.2 发送方和接收方如何通信

将客服端封装成应该person对象,然后发送对象以及对象的大小,也就是send(&person,sizeof(person))?存在什么问题?

问题就是如果数据是在堆上时,使用sizeof是有问题的。因为sizeof不能计算动态分配的内存。一般网络传输中都是使用序列化(将数据对象转换为二进制过程)和反序列化(将二进制恢复为数据对象过程)进行通信的。

3. 一个完整的通信协议应该包括以下组成部分:

1协议字段补充

  1. 如果需要处理不同业务功能时,可以在body里面封装不同的cmd(command),每一个不同的cmd标识不同的业务功能,比如login表示登录,regist表示注册。
  2. appid:对外提供SDK服务时,用来识别不同的客服,比如英雄联盟的客户以及绝地求生的客户。
  3. server_id:对应命令的分组。比如文件命令和网络命令,文件file命令下可以存在很多子命令,比如ls,tree等等。网路命令下也可以存在很多子命令,比如lsof,top等等。
  4. command_id:具体的子命令,比如ls、tree等。

4. protobuf的使用

4.1 准备工作
  1. 下载安装protobuf工具,编译安装protobuf的cpp版本。
  2. 编写proto文件:也就是一个数据结构。包含通信协议的一些命令之类的详细结构。客服端和服务器需要同一份proto文件。主要这里不是说客服端和服务端在各自的git仓库建立一个proto文件,而是从一个git仓库拉取同一份proto文件(主要是为了后期维护,当一份修改时,另外一方可以实时知道)。
  3. 将proto文件生成对应的.cc和.h文件
4.2 protobuf经验总结
  1. proto文件命名规则:比如IMLogin.pro,IM表示即时通信项目,Login登录相关的proto文件
  2. proto命名空间:需要和文件命令空间对应。
  3. 引用文件:引用其他proto文件,需要加上命名空间package。(PDU:protocol data unit:通信数据单元。)
  4. 协议封装。

标签:文件,封装,protobuf,proto,通信协议,命令,设计,如何
From: https://www.cnblogs.com/wzy-cc/p/18493297

相关文章

  • 如何手动安装jenkins插件
    第一步:进入jenkins的插件地址https://plugins.jenkins.io/(有时加载会慢,等等就会加载出来,加载不出来的话,就使用梯子)第二步:搜索插件第三步:选择插件第四步:查看详情页第五步:下载插件如果是下载当前插件的话,直接点击directlink如果要下载之前版本的插件的话,点击checksums......
  • 海量大模型如何一键部署上云?函数计算 x ModelScope 社区给出答案
    作者:魔搭官方大模型在过去一年多时间里的一路技术狂奔,深刻的改变了今天模型和AI的整体应用生态,也给开发者提供纷繁复杂的模型选择。在多样化大模型的背后,OpenAI得益于在领域的先发优势,其API接口今天也成为了业界的一个事实标准。许多开源工具和框架,包括LlamaIndex,LangChain......
  • element-ui中,使用this.$message.success(“登录成功“),如何修改文字的样式呢?
    在element-ui中使用this.$message.success(“注册成功”);时,直接修改文字样式并没有暴露出很方便的接口,因为ElementUI的消息提示组件Message是通过JavaScript动态创建的。但是你可以通过以下方法自定义消息的样式:方法1:使用customClass属性ElementUI的Me......
  • 2024年软件设计师中级(软考中级)详细笔记【9】数据库技术基础(分值6分)
    目录前言第9章数据库技术基础(6分)9.1基本概念9.1.1数据库与数据库系统9.1.5数据库的三级模式结构9.2数据模型9.2.1数据模型的基本概念9.2.2数据模型的三要素9.2.3E-R模型9.2.4数据模型9.3关系代数9.3.1关系数据库的基本概念9.3.1.1关系模型9.3.25种基本的......
  • java计算机毕业设计仓库管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景在现代商业运营中,仓库管理的重要性日益凸显。随着企业规模的不断扩大和业务量的增加,传统的仓库管理方式面临着诸多挑战。例如,商品种类和数量繁多......
  • (开题报告)django+vue酸奶配送管理系统的设计与实现论文+源码
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于酸奶配送管理系统的研究,现有研究主要以一般性的物流配送或食品配送管理系统为主,专门针对酸奶配送管理系统的研究较少。在国内外的......
  • 计算机毕业设计价格以及选题指南
    第一点,关于计算机毕业设计的大致的价位,需要看需求的不同进行分类。下面我会给出大致价格供大家参考:一、程序部分1.成品的程序:说白了就是别人已经写好的程序,已经开发完成,可以直接拿去进行使用的程序,这种的价格会比较便宜,大概会在150-300之间。这种程序一般没有办法给到比较ok......
  • 【C#基础面试题 09.如何在C#中定义和调用函数?】
    09.如何在C#中定义和调用函数?文章目录09.如何在C#中定义和调用函数?本文重点内容摘要一、回答重点二、扩展知识1.函数的定义2.函数的调用1)在类内部调用:2)在类外部调用总结结语本文重点内容摘要A.回答重点B.扩展知识一、回答重点定义方法:编写方法的签名,包括返......
  • 计算机毕业设计选题及选代做避免踩坑指南
    每一年即将毕业的计算机专业的大学生都会因为毕业设计而头痛,跟着学校没有学到技术,但是毕设又会要求的你尽量完美。大多数同学都会选择代做毕设,去tb,pdd去找,但是往往到最后会不善而终,不仅浪费了钱,也浪费了时间和精力。现在这个行业全包质量也要求高的基本上都是在2000左右,程序一......
  • 2024/10/22-人工智能教育技术学-提示语设计
    操作演练-完成一份简单的教案(期末大作业之一)用AI完成(10分钟)提示语设计的重要性要点(来自KIMI2024)明确目标,简洁,上下文相关性,避免歧义,迭代优化,考虑多样性,利用示例,遵循道德和法律标准提示语设计四方面(公式,AI优化,Markdown模板,提示语智能体)公式-任务导向(请你作为角色,执行任务,要求,......