news 2026/9/3 1:19:00

Linux编程网络基础(四)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux编程网络基础(四)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、应用层协议与序列化
  • 二、为什么要进行序列化与反序列化
  • 三、序列化反序列化的工具
  • 四、理解TCP为什么支持全双工
  • 五、面向字节流传输与面向数据报传输的异同
    • 面向字节流:
    • 面向数据报:
  • 附:Jsoncpp

一、应用层协议与序列化

在实际生活中,帮助我们解决实际问题,满足我们日常生活需要的网络程序,都是在应用层
在读写数据时, 都是按字节流的⽅式来发送接收的. 如果我们要传输⼀些 “结构化的数据” 该怎么办?

二、为什么要进行序列化与反序列化

  • 数据格式统一:不同的机器、操作系统和编程语言可能有不同的数据表示方式(如字节序、数据类型的大小等)。序列化可以将数据转换为一种标准格式,确保发送方和接收方都能正确解析。
  • 跨平台和语言交互:在分布式系统中,不同的服务可能用不同的语言编写,运行在不同的平台上。序列化提供了一种通用的数据交换格式,使得这些服务可以互相通信。
  • 网络传输:网络传输的数据必须是连续的字节序列。复杂的数据结构(如树、图、对象等)无法直接通过网络发送,必须先转换为字节流。
  • 存储持久化:将数据序列化后可以保存到文件或数据库中,以便以后恢复。

    在双方通信中,只要保证, ⼀端发送时构造的数据, 在另⼀端能够正确的进行解析, 就是可以的. 这种约定, 就是应用层协议。

三、序列化反序列化的工具

四、理解TCP为什么支持全双工

什么是全双工?

  • 半双工:通信双方可以相互通信,但不能同时收发数据(如对讲机)
  • 全双工:通信双方可以同时收发数据(如电话)

  • 在任何⼀台主机上,TCP连接既有发送缓冲区,⼜有接收缓冲区
  • 这也是么⼀个tcpsockfd读写都是它的原因
  • 实际数据什么时候发,发多少,出错了怎么办,由TCP控制,所以TCP叫做传输控制协议

内核缓冲区分离

对比常用读取发送函数

五、面向字节流传输与面向数据报传输的异同

面向字节流:

  • 提供可靠的、有序的、双向的字节流传输
  • 面向连接(需要三次握手建立连接)
  • 保证数据顺序(按发送顺序到达)
  • 假设对方接收缓冲区只剩10字节容量,而我方发送缓冲区还有20字节内容待发送,那么会发送10字节内容给对方,这时报文就不完整了,需要应用层来保证数据报文的完整性

面向数据报:

  • 提供不可靠的、无序的、独立的数据包传输
  • 无连接(无需建立连接)
  • 不保证顺序(可能乱序到达)
  • 只会发送完整的报文,不会将报文分割

附:Jsoncpp

Jsoncpp 是⼀个⽤于处理 JSON 数据的 C++ 库。它提供了将 JSON 数据序列化为字符串以及从字符串反序列化为 C++ 数据结构的功能。

  • 安装
ubuntu:sudo apt-get install libjsoncpp-dev Centos:sudo yum install jsoncpp-devel
  • 序列化
    Jsoncpp提供了多种⽅式进⾏序列化:

使⽤ Json::Value 的 toStyledString ⽅法:

#include<iostream>#include<string>#include<sstream>#include<memory>#include<jsoncpp/json/json.h>intmain(){Json::Value root;root["name"]="joe";root["sex"]="男";Json::StreamWriterBuilder wbuilder;// StreamWriter的⼯⼚std::unique_ptr<Json::StreamWriter>writer(wbuilder.newStreamWriter());std::stringstream ss;writer->write(root,&ss);std::cout<<ss.str()<<std::endl;return0;}结果:{"name":"joe","sex":"男"}

使⽤ Json::StreamWriter :

#include<iostream>#include<string>#include<sstream>#include<memory>#include<jsoncpp/json/json.h>intmain(){Json::Value root;root["name"]="joe";root["sex"]="男";Json::StreamWriterBuilder wbuilder;// StreamWriter的⼯⼚std::unique_ptr<Json::StreamWriter>writer(wbuilder.newStreamWriter());std::stringstream ss;writer->write(root,&ss);std::cout<<ss.str()<<std::endl;return0;}结果:{"name":"joe","sex":"男"}

使⽤ Json::FastWriter :

#include<iostream>#include<string>#include<sstream>#include<memory>#include<jsoncpp/json/json.h>intmain(){Json::Value root;root["name"]="joe";root["sex"]="男";Json::FastWriter writer;std::string s=writer.write(root);std::cout<<s<<std::endl;return0;}结果:{"name":"joe","sex":"男"}
  • 反序列化

使⽤ Json::Reader :

#include<iostream>#include<string>#include<jsoncpp/json/json.h>intmain(){// JSON 字符串std::string json_string="{\"name\":\"张三\", \"age\":30,\"city\":\"北京\"}";// 解析 JSON 字符串Json::Reader reader;Json::Value root;// 从字符串中读取 JSON 数据boolparsingSuccessful=reader.parse(json_string,root);if(!parsingSuccessful){// 解析失败,输出错误信息std::cout<<"Failed to parse JSON: "<<reader.getFormattedErrorMessages()<<std::endl;return1;}// 访问 JSON 数据std::string name=root["name"].asString();intage=root["age"].asInt();std::string city=root["city"].asString();// 输出结果std::cout<<"Name: "<<name<<std::endl;std::cout<<"Age: "<<age<<std::endl;std::cout<<"City: "<<city<<std::endl;return0;}结果: Name:张三 Age:30City:北京
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 21:46:06

商业模式画布填充:LobeChat理清商业逻辑

商业模式画布填充&#xff1a;LobeChat理清商业逻辑 在AI技术加速落地的今天&#xff0c;大语言模型&#xff08;LLM&#xff09;的能力早已不是瓶颈。真正制约其价值释放的&#xff0c;是用户与模型之间的交互鸿沟——再强大的模型&#xff0c;如果界面难用、集成困难、扩展受…

作者头像 李华
网站建设 2026/9/2 1:30:08

随机深度优先搜索(Randomized DFS)算法原理

随机深度优先搜索是深度优先搜索的变种&#xff0c;通过在每一步随机选择邻接节点来增加路径的不可预测性。该算法天然适合生成或解决迷宫问题&#xff0c;因其倾向于生成长而曲折的路径。核心特点&#xff1a;使用栈&#xff08;显式或隐式&#xff09;实现回溯随机选择邻接节…

作者头像 李华
网站建设 2026/9/3 0:52:04

计算机Java毕设实战-基于javaweb的在线图书借阅管理系统图书馆在线借阅管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/9/2 15:45:17

计算机Java毕设实战-基于JavaWeb的家装一体化平台室内设计、装修施工、建材选购【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/9/2 7:09:14

计算机Java毕设实战-基于SpringBoot+Vue的汽配销售管理系统的设计与实现基于JavaWeb的汽配销售管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/9/2 20:09:44

【LLM基础教程】从序列切分到上下文窗口02_三种数据切分方法

上一节内容&#xff1a;【LLM基础教程】从序列切分到上下文窗口01_为什么序列建模必须切分数据 本节也是对沐神课程的进一步理解&#xff1a;53 语言模型【动手学深度学习v2】 ​ 在上一节中我们看到&#xff1a;序列切分的目的&#xff0c;是把一条很长的文本&#xff0c;转化…

作者头像 李华