当前位置: 首页 > news >正文

序列化,应用层自定义协议

我们发的是一个结构化的数据

OS内部,协议全部都是传递结构体对象。可以直接发送二进制对象吗?因为CS双方都能认识这个结构体!!!

可以直接发送二进制对象,但是不建议

1. 客户端和服务器说属于不同的OS,不同的结构体,在不同的对齐方案下,我们的结构体大小可能不一样。存在内存对其问题,可能导致无法正确解析

2. 客户端和服务器的语言可能不同

从今天开始,我们要进行网络协议的通信,在应用层,强烈建议使用序列化和反序列化方案,至于直接传递结构体的方案,除非特殊场景,否则不建议

write本质是拷贝,

1. write,read就是收发消息 -- write,和read是不是把数据发送到了网络中? 不是,本质上把数据由用户拷贝到Os内核里,os决定什么时候发,OS把数据发送到网络中,本质也是拷贝

2. 主机间通信的本质:把发送方的发送缓冲区内部的数据,拷贝到对端的接受缓冲区

3. TCP通道是全双工的?因为有两对发送和接受缓冲区,接受和发送是分离的

读数据其实是检测接受缓冲区里有没有数据,没有数据read就会阻塞,read也是拷贝,从内核拷贝到用户

文件描述符对应的tcp发送缓冲区,tcp自主决定什么时候发,发多少,出错了呢?传输控制协议

四组生产者消费模型(内核和用户之间),阻塞?因为和系统做同步

计算机世界:通信即拷贝

tcp:面向字节流,什么时候发?发多少?出错?

在tcp中,要读到完整的报文,由接收方应用层自己决定的

我们未来定制的协议:

1.结构化字段,提供好序列化和反序列化方案

2.解决因为字节流问题导致读取不完整的问题(只处理读取)

Jsoncpp是一个用于处理TSON数据的C++库,他提供了将JSON数据序列化为字符串以及从字符串反序列化为C++数据的功能,Jsoncpp是开源的,广泛用于各种需要处理JSON数据的C++项目

因为tcp是面向字节流的。当读取方在读取的时候,可能读到一个完整的json请求,也可能会读到半个、一个、五个、五个半请求json串。都会有可能存在

read本身并不能保证读到的报文的完整性,只能保证如果有数据就读上来。谁来保证报文的完整性?应用层程序员自己保证。就需要进一步定制协议。

当我们tcp中读取数据的时候,读到的报文不完整,或者多读导致下一个报文不完整,这个问题就叫做“粘报”问题

http://www.dtcms.com/a/355737.html

相关文章:

  • 万博智云联合华为云共建高度自动化的云容灾基线解决方案
  • 浅谈JMeter Listener
  • 自学嵌入式第三十天:Linux系统编程-线程的控制
  • 因果推断在解决多触点归因问题上的必要性
  • 利用ollama部署本地大模型 离线使用
  • 告别Java依赖!GISBox三维场景编辑+服务发布一站式工具横评
  • 模型汇总-数学建模
  • echarts碰到el-tabs首次加载echarts宽度只有100px
  • LoRA模型的可训练参数解析(61)
  • 杂记 08
  • CnSTD+CnOCR的联合使用
  • vsgCs显示谷歌全球倾斜模型-节点
  • 9 从 “内存怎么存” 到 “指针怎么用”:计算机内存编址机制 + C 语言指针核心 + memory 模拟实现
  • “AI+制造”政策下,户外智能清洁如何跑出加速度?
  • 20250828-学习JumpServer开源堡垒机使用:统一访问入口 + 安全管控 + 操作审计
  • 复杂BI报表SQL
  • 集成电路学习:什么是TensorFlow
  • MCP Factory——专业 MCP Server 开发平台,正式发布,免费下载!
  • 一站式爬虫MCP服务器助力AI市场分析师
  • 微服务相关面试题
  • ComfyUI ControlNet 保姆级教程:开箱即用的示例工作流,精准控制AI图像生成
  • 记录git报错ssh: connect to host github.com port 22: Connection timed out,已解决
  • P3373 【模板】线段树 2
  • l六步完成麒麟操作系统挂载本地REPO源
  • 软考 系统架构设计师系列知识点之杂项集萃(134)
  • IPv6过渡技术IPv6 over IPv4
  • 【数据结构与算法】LeetCode 20.有效的括号
  • 跨网络通信:路由器如何实现全球互联
  • QT控件:【控件概述】【QWidget核心体系】【按钮类控件】【显示类控件】
  • 实战回忆录从webshell开始突破边界