【计算机网络】应用层序列化

news2024/11/15 19:30:49

目录

  • 一、序列化和反序列化
  • 二、重新理解 read、write、recv、send 和 tcp 为什么支持全双工
  • 三、Jsoncpp

一、序列化和反序列化

如果我们要实现一个网络版的加法器,需要把客户端的数据发给服务端,由服务端处理数据,再把处理结果发给客户端。

方案:

  • 定义结构体来表示我们需要交互的信息
  • 发送数据时将这个结构体按照一个规则转换成字符串, 接收到数据的时候再按照相同的规则把字符串转化回结构体。这个过程叫做 “序列化” 和 “反序列化”

只要保证一段发送的数据,另一端接收能够正确解析就行,这种约定就是应用层协议。

在这里插入图片描述
发送一条聊天消息,由3个字符串组成。序列化,将消息由多变一,方便传输。网络通信不需要关注具体是什么,只要传输的是字节流就行。反序列化,将消息由一变多,方便上层处理。

序列化:

#include <iostream>
#include <jsoncpp/json/json.h>
#include <string>
#include <fstream>

using namespace std;

struct stu
{
    string name;
    int age;
    double weight;
};

int main()
{
    // 结构化数据
    struct stu zs = {"张三", 18, 72};

    // 转换为字符串
    Json::Value root;
    root["name"] = zs.name;
    root["age"] = zs.age;
    root["weight"] = zs.weight;

    //Json::FastWriter writer;
    Json::StyledWriter writer;
    string str = writer.write(root);

    ofstream out("out.txt");
    if(!out.is_open())
    {
        cout << str;
        return 1;
    }
    out << str;
    out.close();
    
    return 0;
}

写入文件:
在这里插入图片描述

反序列化:

#include <iostream>
#include <jsoncpp/json/json.h>
#include <string>
#include <fstream>

using namespace std;

struct stu
{
    string name;
    int age;
    double weight;

    void Debug()
    {
        cout << name << endl;
        cout << age << endl;
        cout << weight << endl;
    }
};

int main()
{
    ifstream in("out.txt");
    if(!in.is_open()) return 1;
    char buffer[1024];
    in.read(buffer, sizeof(buffer));
    in.close();

    // 反序列化
    string json_string = buffer;
    Json::Value root;
    Json::Reader reader;
    bool res = reader.parse(json_string, root);
    (void)res;

    struct stu zs;
    zs.name = root["name"].asString();
    zs.age = root["age"].asInt();
    zs.weight = root["weight"].asDouble();

    zs.Debug();

    return 0;
}

在这里插入图片描述

二、重新理解 read、write、recv、send 和 tcp 为什么支持全双工

先回顾下read、write这些系统调用是怎么读、写的:
在这里插入图片描述
用户发送一段数据先到C缓冲区,然后通过系统调用交给操作系统的管理区,发送的数据到task_struct,根据fd在文件描述符表找到位置,再指向指定的struct file,然后把数据传输到缓冲区,缓冲区会把数据刷新到磁盘中。

在这里插入图片描述
用户在主机A发送消息给另一个用户主机B,消息序列化后通过系统调用到发送缓冲区,然后经过网络的每个分层到另一个主机,再自底向上到接收缓冲区,然后通过系统调用到应用层,再序列化变成用户可看到的消息。注意:系统调用让数据从用户层到发送缓冲区,或者从接收缓冲区到用户层,这个过程都是拷贝。所以,read、write等系统调用本质是拷贝函数。

tcp发送数据,其实是把数据从自己的发送缓冲区拷贝到接收方的接收缓冲区,发送缓冲区和接收缓冲区都是在各自的操作系统里,所以本质是双方的操作系统在进行通信。通信就是在拷贝数据。

如果接收缓冲区没有数据,那么read\recv系统调用会阻塞,这里的阻塞其实是用户层在进行同步,即发送方发数据,接收方才收数据。

那么tcp为什么支持全双工?因为双方都是一对发送缓冲区和接收缓冲区。为什么系统调用也支持全双工?因为fd既可以读,又可以写,就是有一对发送缓冲区和接收缓冲区。

三、Jsoncpp

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

特性:

  • 简单易用:Jsoncpp 提供了直观的 API,使得处理 JSON 数据变得简单
  • 高性能:Jsoncpp 的性能经过优化,能够高效地处理大量 JSON 数据
  • 全面支持:支持 JSON 标准中的所有数据类型,包括对象、数组、字符串、数字、布尔值和 null
  • 错误处理:在解析 JSON 数据时,Jsoncpp 提供了详细的错误信息和位置,方便开发者调试

序列化函数:toStyledString、StreamWriter 和 FastWriter
反序列化函数:Json::Reader 和 parseFromStream

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

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

相关文章

【线程】线程的概念

本文重点&#xff1a; 了解线程概念&#xff0c;理解线程与进程区别与联系 线程的概念 线程是进程内的一个执行分支&#xff0c;执行粒度要比进程细 乍一看&#xff0c;肯定不懂&#xff0c;太抽象了&#xff0c;怎么理解呢&#xff1f; 以前讲的进程&#xff0c;每个进程…

spring boot设置多环境的配置文件

目录 说明规划步骤案例application.ymlapplication-dev.ymlapplication-test.ymlapplication-prod.yml 说明 在项目开发过程中&#xff0c;回有开发环境、测试环境、生产环境等等。如果所有环境的配置都放在application.yml中并且需要打包到不同的环境中时&#xff0c;修改app…

还在用旧的电脑屏保?新一代电脑屏保你见识过吗?

还在用旧的电脑屏保&#xff1f;新一代电脑屏保你见识过吗&#xff1f;旧的电脑屏保我们已经见怪不怪了&#xff0c;没有什么新颖的效果&#xff0c;而新一代的电脑屏保在视觉上做了很多突破。一个好看的屏保&#xff0c;会让你的电脑变得更加美观&#xff0c;更有特色。哪里才…

SpringSecurity原理解析(七):权限校验流程

SpringSecurity是一个权限管理框架&#xff0c;核心功能就是认证和授权&#xff1b;前边已经介绍了认证流程&#xff0c; 这里看下授权的流程和核心类。 一、权限管理的实现 1、开启对权限管理的注解控制 工程中后端各种请求资源要想被SpringSecurity的权限管理控制&#xf…

八、4 DMA+AD多通道(代码)

一、&#xff08;1&#xff09;接线图 PA0接一个电位器&#xff0c;PA1~PA3接3个传感器的AO输出 &#xff08;2&#xff09;流程 二、代码部分 &#xff08;1&#xff09;复制AD多通道的工程 将DMA初始化的部分复制到ADC_Cmd之前 将开启DMA时钟的函数挪到前面 &#xff08;…

人工智能——猴子摘香蕉问题

一、实验目的 求解猴子摘香蕉问题&#xff0c;根据猴子不同的位置&#xff0c;求解猴子的移动范围&#xff0c;求解对应的过程&#xff0c;针对不同的目标状态进行求解。 二、实验内容 根据场景有猴子、箱子、香蕉&#xff0c;香蕉挂天花板上。定义多种谓词描述位置、状态等…

Linux入门1

文章目录 一、Linux的认识和构建1.1 初始Linux1.2 虚拟机1.3 Final Shell1.4 虚拟机快照 二 、Linux的相关知识2.1 Linux目录结构2.2 linux的基本命令 一、Linux的认识和构建 1.1 初始Linux 相比于其他的操作系统&#xff0c;Linux操作系统是在服务器端应用最为广泛和普遍被认…

力扣最热一百题——螺旋矩阵

目录 题目链接&#xff1a;54. 螺旋矩阵 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;模拟 1. 边界初始化 2. 循环遍历矩阵 3. 从左到右遍历上边界 4. 从上到下遍历右边界 5. 从右到左遍历下边界 6. 从下到上遍历左边…

2.1 溪降技术:溪降运动的定义

目录 2.1 溪降运动的定义概览观看视频课程电子书: 溪降运动的定义**“溪降”&#xff08;Canyoning&#xff09;还是“峡谷探险”&#xff08;Canyoneering&#xff09;&#xff1f;**湿峡谷与干峡谷干峡谷**湿峡谷** 总结 2.1 溪降运动的定义 概览 溪降(新西兰) 溪降是一种在非…

P5425 [USACO19OPEN] I Would Walk 500 Miles G

*原题链接* 很离谱的题。首先可以想到暴力连边&#xff0c;整个图为一个完全图&#xff0c;将所有的边选出来&#xff0c;然后从小到大一条条加入&#xff0c;当剩下集合数量 <K 的时候就结束。答案为加入的最后一条边的大小。如果用prim算法的话时间复杂度为。足以通过此题…

yjs05——matplotlib画其他图像

不管是折线图还是散点图&#xff0c;饼状图&#xff0c;柱状图等&#xff0c;其流程都是 1.创建幕布 ❤2.画图画坐标补充信息 3.保存图像 4.展示图像 不同就是在画图时候的代码不太相同 折线&#xff1a;plt.plot(x,y) 散点&#xff1a;plt.scatter() 柱状图&#xff1a;plt.hi…

Threejs合并模型动画(下)

本文目录 前言最终效果展示一、AnimationAction1.1 简要介绍1.2 常用方法二、代码三、效果前言 我们在Threejs合并模型动画(上)以及Threejs合并模型动画(中)展示了同个模型不同动画的合并与展示,但是我们发现如果我们只是通过代码去改变模型的动画的话那肯定没意思,我们希…

微型导轨在光学仪器中的应用!

微型导轨在光学仪器中扮演着至关重要的角色&#xff0c;以其高精度、高稳定性的特点&#xff0c;提供稳定的光学路径和精确的光学元件位置。接下来&#xff0c;我们一起来看看微型导轨在光学仪器中的应用实例&#xff01; 1、显微镜&#xff1a;在显微镜中&#xff0c;微型导轨…

Linux-Swap分区使用与扩容

一、背景 在Linux系统中&#xff0c;swap空间&#xff08;通常称为swap分区&#xff09;是一个用于补充内存资源的重要组件。当系统的物理RAM不足时&#xff0c;Linux会将一部分不经常使用的内存页面移动到硬盘上的swap空间中&#xff0c;这个过程被称为分页&#xff08;paging…

Python并发100个请求:提升数据获取效率的艺术

在当今数据驱动的世界中&#xff0c;快速有效地获取数据变得至关重要。Python&#xff0c;作为一种广泛使用的编程语言&#xff0c;提供了多种并发编程工具&#xff0c;使得同时发送大量网络请求成为可能。本文将探讨如何使用Python并发地发送100个网络请求&#xff0c;并分析其…

gin集成jaeger中间件实现链路追踪

1. 背景 新业务线带来新项目启动&#xff0c;需要改进原有项目的基础框架和组件能力&#xff0c;以提升后续开发和维护效率。项目搭建主要包括技术选型、框架搭建、基础服务搭建等。这其中就涉及到链路追踪的内容&#xff0c;结合其中的踩坑情况&#xff0c;用一篇文章来说明完…

SpringBoot权限认证-Sa-Token的使用与详解

本文详细介绍了Sa-Token在Java项目中的使用方法&#xff0c;包括Sa-Token的基本概念、与其他权限框架的比较、基本语法和高级用法&#xff0c;并通过实例讲解了如何在项目中集成和使用Sa-Token。作为一款轻量级Java权限认证框架&#xff0c;Sa-Token在简化权限管理、提高开发效…

编译原理之预处理

目录 生成预处理文件的的命令 预处理做了什么 实验 --------------------------------------------------------------------------------------------------------------------------------- 本篇文章主要是带着大家一起看看预处理阶段编译器都做了些什么 --------------…

多线程1(游戏逆向)

#include<iostream> #include<windows.h> #include<tchar.h> #include<stdio.h> #include <process.h> #pragma warning(disable:4996) //exe应用程序 VOID PrintUI(CONST CHAR* ExeName, CONST CHAR* UIName, CONST CHAR* color, SHORT X坐标, …

react hooks--概述

前言 ◼ Hook 是 React 16.8 的新增特性&#xff0c;它可以让我们在不编写class的情况下使用state以及其他的React特性&#xff08;比如生命周期&#xff09;。 ◼ 我们先来思考一下class组件相对于函数式组件有什么优势&#xff1f;比较常见的是下面的优势&#xff1a; ◼ …