网络基础二补充——json与http协议

五、市面上常用序列化和反序列化工具

​ 常用的有:json、protobuf、xml三种方案;

5.1json的使用

1.安装jsoncpp库,是一个第三方的开发库文件;

sudo yum install -y jsoncpp-devel

2.使用json

​ 经常使用的头文件是json.h,

在这里插入图片描述

​ 使用的动态库文件;

在这里插入图片描述

3.json语法

#include <jsoncpp/json/json.h>//序列化//1.创建Value对象
Json::Value root;
//Value是万能类,重载了[],返回值是Value对象引用,它的内部是一堆kv的形式;甚至可以放Value;
//root.size()是根据k来划分的;//2.设置Value
root["x"] = 100;
root["y"] = 200;
root["op"] = '+';
root["desc"] = "this is a add algorithm";//3.序列化Value
//有两种方式
//3.1对象实例化
Json::FastWriter w;
Json::StyledWriter w;//好处是可读性更好一些	
//3.2进行序列化
w.write(root);
//一个参数为Value对象;
std::cout << root << std::endl;
std::cout << w.write(root) << std::endl;

在这里插入图片描述

在这里插入图片描述

//4.反序列化Value
//4.1创建Value缓冲区和reader对象
Json::Value v;
Json::Reader r;
//4.2进行反序列化
r.parse(str,v);
//第一个参数是要进行反序列化的字符串;
//第二个参数是缓冲区;
//第三个参数表示是否有效,默认使用缺省参数;
//5.将Value对象解析成有效对象,使用as系列转换成有效的数据
int x = v["x"].asInt();
int y = v["y"].asInt();
char op = v["op"].asInt();
std::string desc = v["desc"].asCString();
std::cout << desc << " " << x << " " << op << " " << y << std::endl;

六、重谈ISO7层模型

6.1会话层

​ 实际上在代码当中体现为tcp服务端和客户端获取连接和发起连接,负责管理好连接;

6.2表示层

​ 其实就是指定制协议与序列化和反序列化,数据在网络中的转化;

6.3应用层

​ 针对特定应用的协议;

七、http协议

7.1统一资源定位符

​ 在平常的生活中,访问服务器其实使用的不是IP地址,而是域名这样的东西;域名的作用就是提高用户的体验,直接使用IP地址可读性较差,使用域名间接转换为IP地址这种方式可读性更好,更容易让人们接受这种使用方式;

​ 在浏览器中网址位置输入IP地址,会自动将39.156.66.14IP地址添加一些字段变为"http 😕/39.156.66.14/",浏览器中默认使用的协议一般是http或者https,会默认进行拼接的;这些协议服务的端口号一般是得固定下来,如:http是80,https是443,所以在拼接协议字段的时候是默认增加了端口号的;

​ url叫做统一资源定位符;由协议(服务的端口号)+域名(远端主机的IP地址)+资源路径,使用统一资源定位符,通过唯一路径定位,就可以在网上找到资源;其实就是在远端的主机上,使用服务进程并通过资源路径来查找主机内的资源;

​ 网络行为一般有两种:1.下载;2.上传;

在这里插入图片描述

​ 使用?k=v这种形式,来提交参数,多个参数可以使用&来进行划分支持多参数提交;

7.2urlencode和urldecode

​ 在使用url的时候,少量的情况会将提交或者获取的数据(可能包含和url中特殊字符冲突的字符),要求浏览器和服务器双方之间要进行编码(encode)和解码(decode);

​ 编码和解码防止和数据和url本身冲突;

​ 编码的规则是将需要转码的字符(在ASCII码中对应一个数,一个字节大小)转换为16进制,然后从右向左取4位,不足4位的每两位为1位,在前面加上%,编码成%xy的形式;

​ 网上也有在线进行编码和解码的工具;

7.3http请求和响应

​ 无论是请求还是响应都是以行的形式来陈列请求和响应

7.3.1http请求格式

​ 由请求行、请求报文、空行、请求正文构成;

请求行

​ 1.请求行之中除了结尾是不可以再出现回车换行符的;2.请求行的报头字段共有三部分,第一部分是请求方法,一般使用两种,一种叫做get方法,一种叫做post方法;第二部分以空格作为分隔符和第一部分区分,具体内容是URL,表示当前当前要请求的资源是谁;第三部分和第二部分也是使用空格作为分隔符,叫做请求的协议版本,即http版本,包括1.0 1.1 2.0,格式为http/1.1;注意需要是大写的;

请求报文

​ 由多行构成,每一行都叫做http的请求属性;这些属性大部分是键值对的形式;

空行

​ \r\n在行的最开始位置,通过行读取的方式,将报头和有效载荷分离;

请求正文

​ 要上传的内容;

在这里插入图片描述

​ 无法保证读到完整的正文,但是可以保证读到完整的请求报头;而报头的属性有 表示正文长度的字段,然后根据此属性读到一个完整的报文;

7.3.1http响应格式

​ 与请求类似;

状态行

​ 包括三部分,第一部分http版本(便于进行划分功能),第二部分状态码,第三部分为状态码描述;如:404 Not Found;对于请求必须有响应;

在这里插入图片描述

7.4使用工具进行http响应的抓取

1.telnet

telnet www.baidu.com 80

​ 最简单的请求报头和报文是可以没有的,但是请求行和空行必须有;所以如下操作之后即可获得一个响应;

GET / HTTP/1.1

​ 如下就是一个响应报文;

在这里插入图片描述

2.fiddler

​ 基于http进行抓包;fiddler工具就是一种代理,本来是浏览器访问服务器,变成了fiddler工具代理,进行请求包装和获取响应,然后再返回给浏览器;

3.postman

​ 当成浏览器使用;

7.5实现一个简单的http服务

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
//也可以用来进行tcp读取
//与read类似,多了第四个参数可以设置读取的方式
//0表示阻塞的方式
#pragma once#include <iostream>
#include <string>
#include <pthread.h>
#include <unistd.h>
#include "Socket.hpp"
#include "Log.hpp"const uint16_t defaultport = 8888;
class threadinfo
{
public:threadinfo(int sockfd) : sockfd_(sockfd) {}public:int sockfd_;
};class httpserver
{
public:httpserver(uint16_t port = defaultport) : port_(port) {}~httpserver() {}public:static void httphandler(int sockfd){char buff[10240];ssize_t n = recv(sockfd, buff, sizeof(buff) - 1, 0);if (n > 0){buff[n] = 0;std::cout << buff;// 返回一个响应std::string text = "<html><body><h3>hello world</h3></body></html>";std::string response_line = "HTTP/1.0 200 OK\r\n";std::string response_header = "Content-Length: ";response_header += std::to_string(text.size());response_header += "\r\n\r\n";std::string response;response += response_line;response += response_header;response += text;send(sockfd, response.c_str(), response.size(), 0);}close(sockfd);}static void *routine(void *args){pthread_detach(pthread_self());threadinfo *hs = static_cast<threadinfo *>(args);httphandler(hs->sockfd_);delete hs;return nullptr;}bool start(){listensockfd_.Socket();listensockfd_.Bind(port_);listensockfd_.Listen();// lg(Info, "init done...");while (true){std::string clientip;uint16_t clientport;int sockfd = listensockfd_.Accept(&clientip, &clientport);if (sockfd < 0)continue;pthread_t tid;threadinfo *td = new threadinfo(sockfd);pthread_create(&tid, nullptr, routine, (void *)td);}}private:uint16_t port_;Sock listensockfd_;
};

在这里插入图片描述

​ 1.可以通过User-Agent来设计反爬策略;2.浏览器下载app,通过User-Agent的属性,来推送相关系统的软件;

​ http对于请求会创建一个响应,添加报头、空行和正文,包括将网页拼接到正文部分;发送过来的请求可能会包含请求什么网页,什么资源,通过url呈现出来;

7.6web根目录

​ wwwroot是web根目录,存放了允许别人访问的所有资源;

​ 可以直接在本地修改文件,通过浏览器直接访问到修改后的结果;

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

气膜室内足球馆:价格究竟是多少?

气膜建筑在体育场馆中的应用越来越广泛&#xff0c;而气膜室内足球馆作为其中的一种代表&#xff0c;备受关注。那么&#xff0c;建设气膜室内足球馆到底需要多少投资呢&#xff1f;轻空间就带您一起来了解一下。 气膜室内足球馆的价格因地区、规格和材料等因素而有所不同。具体…

LLM--提示词Propmt的概念、作用及如何设计提示词

文章目录 1. 什么是提示词&#xff1f;2. 提示词的作用3. 如何设计提示词&#xff1f;3.1. 提供详细的信息3.2. 指定角色3.3. 使用分隔符和特殊符号3.4. 提供示例3.5. 少量示例的思维链&#xff08;COT&#xff09;模型3.6. 思维树&#xff08;TOT&#xff09;模型3.7. 自洽性 …

C++ MFC

C是一种静态数据类型检查的、支持多重编程范式的程序设计语言&#xff0c;支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等泛型程序设计的多种程序设计风格。 MFC(Microsoft Foundation Classes)&#xff0c;是一个微软公司提供的类库&#xff0c;以C类的形式封装…

unity学习(74)——服务器Dispose异常

1.返回的1 2 11是怪物初始化&#xff0c;源代码中也没有 2. 3.客户端中的网络连接初始化如下&#xff1a; 4.不是因为超时&#xff0c;设置10s为超时期限后&#xff0c;客户端和服务器有时依然会报错&#xff01; 5.我感觉就是update中发包给弄坏的&#xff01; 6.不在“帧”…

本地GPU调用失败问题解决3重新配置anaconda环境(成功)

1、右键“以管理员身份”打开anaconda prompt conda create -n python 3.9 2、使用官方下载源的配置 3、修改conda下载超时 conda config --set remote_connect_timeout_secs 60 conda config --set remote_read_timeout_secs 100 查看配置结果conda config --show 配置内…

快速排序---算法

1、算法概念 快速排序&#xff1a;通过一趟排序将待排记录分隔成独立的两部分&#xff0c;其中一部分记录的数据均比另一部分的数据小&#xff0c;则可分别对这两部分记录继续进行排序&#xff0c;以达到震哥哥序列有序。 快速排序的最坏运行情况是O()&#xff0c;比如说顺序数…

蓝桥备赛——贪心

题干 AC Code n, w = map(int, input().split()) # n种类, w核载重 a = [] # [[weight1, value1], [weight2, value2], ...] for _ in range(n):a.append(list(map(int, input().split()))) a.sort(key=lambda x: x[1] / x[0], reverse=True)maxVal = 0for i in a:if i[0…

原生js实现循环滚动效果

原生js实现如下图循环滚动效果 核心代码 <div class"scroll"><div class"blist" id"scrollContainer"><div class"bitem"></div>......<div class"bitem"></div></div> </di…

ViveNAS性能调试笔记(一)

ViveNAS是一个开源的NAS文件服务软件&#xff0c;有一套独立自创的架构&#xff0c;ViveNAS希望能做到下面的目标&#xff1a; - 能支持混合使用高性能的介质(NVMe SSD)和低性能介质&#xff08;HDD&#xff0c;甚至磁带&#xff09;。做到性能、成本动态均衡。因此ViveNAS使用…

数据结构八大常见的排序

数据结构八大常见的排序 常见排序算法分类1.插入排序2.希尔排序(缩小增量排序)3.选择排序4.堆排序5.冒泡排序6.快速排序7.归并排序归并排序非递归的实现8.计数排序 常见排序算法分类 1.插入排序 基本思想&#xff1a;把待排序的数组按大小逐个插入到一个已经排好序的有序序列中…

民航电子数据库:CAEMigrator迁移数据库时总是卡死

目录 一、场景二、异常情况三、排查四、应急方案 一、场景 1、对接民航电子数据库 2、将mysql数据库迁移到cae数据库 3、使用CAEMigrator迁移工具进行数据库迁移时&#xff0c;该工具会卡死&#xff08;不清楚是否是部署cae服务的服务器资源导致&#xff09; 二、异常情况 …

大数据技术之 Apache Doris(一)

第 1 章 Doris 简介 1.1 Doris 概述 Apache Doris 由百度大数据部研发&#xff08;之前叫百度 Palo&#xff0c;2018 年贡献到 Apache 社区后&#xff0c;更名为 Doris &#xff09;&#xff0c;在百度内部&#xff0c;有超过 200 个产品线在使用&#xff0c;部署机器超过 10…

GenICam-GenApi简介

EMVA 1288标准之GemICam-GenApi学习与解读 背景介绍 当前相机不仅用于传输图像&#xff0c;还打包了越来越多的功能。这就导致相机的编程接口越来越复杂。 GenICam的目标是为所有类型的相机提供一个通用的编程接口&#xff0c;无论相机使用何种接口技术&#xff0c;或者实现…

Can‘t connect to server on ‘localhost‘ (10061)

问题&#xff1a;电脑关机重启后&#xff0c;连接不上mysql了&#xff0c;报错信息如下&#xff1a;2002 - Cant connect to server on localhost (10061)解决办法&#xff1a;很大的原因是mysql服务没有启动&#xff0c;需要你重启一下mysql&#xff1a; 以管理员的身份运行cm…

一条SQL在MySQL中的执行过程

图解&#xff1a; 第⼀步&#xff1a;连接器 过程 1. 建⽴连接&#xff1a;与客户端进⾏ TCP 三次握⼿建⽴连接&#xff1b; 2. 校验密码&#xff1a;校验客户端的⽤户名和密码&#xff0c;如果⽤户名或密码不对&#xff0c;则会报错&#xff1b;3. 权限判断&#xff1a…

Vitepress部署到GitHub Pages,工作流

效果&#xff1a; 第一步&#xff1a; 部署 VitePress 站点 | VitePress 执行 npm run docs:build&#xff0c;npm run docs:preview&#xff0c;生成dist文件 第二步&#xff1a; 手动创建.gitignore文件&#xff1a; node_modules .DS_Store dist-ssr cache .cache .temp *…

算法(滑动窗口四)

1.串联所有单词的子串 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如&#xff0c;如果 words ["ab","cd","ef"]&#xff…

【数字IC/FPGA】手撕代码:模3检测器(判断输入序列能否被3整除)

今天我们来手撕一个常见的笔试题&#xff0c;使用的方法是三段式Moore状态机。 题目描述&#xff1a; 输入端口是串行的1bit数据&#xff0c;每个时钟周期进来一位新数据后&#xff0c;实时检查当前序列是否能整除3&#xff0c;若能则输出1&#xff0c;否则输出0。 例如&#…

前端小白的学习之路(webpack)

提示&#xff1a;webpack简介&#xff0c;nvm,npm配置环境,常用命令&#xff0c;基本web项目构建 目录 webpack 1.配置环境 1)node.js node常用命令 2)nvm nvm常用命令&#xff1a; 3)npm npm常用命令 2.构建简易web项目 1)创建目录 2)安装webpack依赖 3)配置 webpac…

设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声。

设计一个动物声音“模拟器”&#xff0c;希望模拟器可以模拟许多动物的叫声。要求如下&#xff1a; &#xff08;1&#xff09;编写接口Animal Animal接口有2个抽象方法cry()和getAnimaName()&#xff0c;即要求实现该接口的各种具体动物类给出自己的叫声和种类名称。 &…