网络基础二补充——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根目录,存放了允许别人访问的所有资源;

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python之Opencv教程(2):图像边缘检测

1、什么是边缘检测 OpenCV中的边缘检测是一种常见的图像处理技术&#xff0c;用于检测图像中物体边缘的位置。常用的边缘检测算法包括Sobel算子、Scharr算子、Laplacian算子和Canny边缘检测算法等。下面将介绍使用OpenCV实现这些边缘检测算法的方法。 2、边缘检测的作用 边缘…

C语言---自定义类型:联合体和枚举

文章目录 前言1. 联合体类型的声明1.1 联合体类型的声明1.2 联合体的特点1.4 联合体大小的计算1.5 联合的一个练习 2.枚举2.1 枚举类型的声明2.2 枚举类型的优点 前言 上一篇我们学习了自定义类型—结构体&#xff0c;大家会发现&#xff0c;构建一个结构体时&#xff0c;有些…

程序数据模型由OS还是硬件架构决定?

文章目录 前言硬件架构的作用OS的作用编译器的角色OS的数据模型参考 前言 在文章 1>>32的结果是1还是0 中提到了数据模型 L P 64 LP64 LP64 &#xff0c;并提出这个数据模型主要是由 U n i x Unix Unix 以及类 U n i x Unix Unix 的操作系统使用居多&#xff0c;例如…

macOS Catalina for mac (macos 10.15系统)v10.15.7正式版

macOS Catalina是苹果公司专为麦金塔电脑推出的桌面操作系统&#xff0c;是macOS的第16个主要版本。它继承了苹果一贯的优雅与高效&#xff0c;不仅引入了分割视图和侧边栏&#xff0c;还带来了全新的音乐和播客应用&#xff0c;极大地提升了用户体验。在隐私保护和安全性方面&…

java学习总结以及考试总结

1.对象的this引用 this引用用于区分成员变量和局部变量&#xff0c;this引用的一定的指的是成员变量 所以说this语句的作用就是区分成员变量和局部变量&#xff08;如何呢&#xff09; package com.temo.test1;public class student{private String name;//成员变量private …

Optimizer神经网络中各种优化器介绍

1. SGD 1.1 batch-GD 每次更新使用全部的样本&#xff0c;注意会对所有的样本取均值&#xff0c;这样每次更新的速度慢。计算量大。 1.2 SGD 每次随机取一个样本。这样更新速度更快。SGD算法在于每次只去拟合一个训练样本&#xff0c;这使得在梯度下降过程中不需去用所有训…

OpenEuler华为欧拉系统安装教程及联网配置

OpenEuler简介 openEuler是一款开源操作系统。当前openEuler内核源于Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c;能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、稳定、安全的开源操作系统&#xff0c;适用于数据库、大数据、云计算、人工智…

【Laravel】07 快速套用一个网站模板

【Laravel】07 快速套用一个网站模板 1. 新增post表2.补充 &#xff1a;生成Model、Controller、迁移文件3. 使用php artisan tinker4. 网站模板下载 课程地址 1. 新增post表 在Model中创建Post (base) ➜ example-app php artisan make:model Post Model created successfu…

力扣 1035. 不相交的线

题目来源&#xff1a;https://leetcode.cn/problems/uncrossed-lines/description/ C题解&#xff1a;经过细细一推导&#xff0c;就发现跟力扣 1143. 最长公共子序列-CSDN博客 换汤不换药。 直线不能相交&#xff0c;说明元素顺序不能改变&#xff0c;求可以绘制的最大连线数…

相机显示储存卡未格式化怎么回事?怎么办

在摄影的学习和实践中&#xff0c;相机是我们记录美好瞬间的得力助手。然而&#xff0c;当相机突然提示储存卡未格式化时&#xff0c;这往往会让我们感到困惑和焦虑。本文将探讨相机显示储存卡未格式化的可能原因&#xff0c;并提供相应的解决方案。 图片来源于网络&#xff0c…

游戏引擎中的大气和云的渲染

一、大气 首先和光线追踪类似&#xff0c;大气渲染也有类似的渲染公式&#xff0c;在实际处理中也有类似 Blinn-Phong的拟合模型。关键参数是当前点到天顶的角度和到太阳的角度 二、大气散射理论 光和介质的接触&#xff1a; Absorption 吸收Out-scattering 散射Emission …

汇编语言第四版-王爽第1章 基础知识

前言 基础知识 &#xff08;1&#xff09;换成bit&#xff0c;1KB1024B&#xff0c;1Byte8bit&#xff1b;1KB1024*8bit&#xff0c;即2的13次方&#xff0c;宽度为13. &#xff08;2&#xff09;1个存储单元只能放1个字节&#xff0c;1KB1024B&#xff1b;编号从0到1023. &a…

web前端面试题----->VUE

Vue的数据双向绑定是通过Vue的响应式系统实现的。具体原理&#xff1a; 1. Vue会在初始化时对数据对象进行遍历&#xff0c;使用Object.defineProperty方法将每个属性转化为getter、setter。这样在访问或修改数据时&#xff0c;Vue能够监听到数据的变化。 2. 当数据发生变化时…

书生 浦语大模型全链路开源体系

通用大模型成为发展通用人工智能的重要途径 书生 浦语大模型的开源历程 书生 浦语 2.0体系&#xff0c;面向不同的使用需求&#xff0c;每个规格包含三个模型版本&#xff0c;&#xff08;7B、20B&#xff09;InternLM2-Base、InternLM2、InternLM2-Chat。 大模型是回归语言建…

python通过shapely 的 valid 判断aoi图形是否有效

测试aoi坐标&#xff1a; 116.527712,39.924304;116.527123,39.924353;116.52707,39.923985;116.527685,39.92397;116.527712,39.924304 如图所示是一个有效的坐标&#xff0c;使用python代码判断是否有效&#xff1a; 代码&#xff1a; from shapely.geometry import Polyg…

数字孪生|山海鲸可视化快速入门

哈喽,你好啊,我是雷工! 今天继续学习山海鲸可视化软件,以下为学习记录。 (一)新建项目 1.1、打开软件后,默认打开我的项目界面,初次打开需要注册,可以通过手机号快速注册。 点击“新建”按钮,新建一个项目。 1.2、根据项目需要选择一个快捷的项目模板,填写项目名称…

C语言 | Leetcode C语言题解之第1题两数之和

题目&#xff1a; 题解&#xff1a; int* twoSum(int* nums, int numsSize, int target, int* returnSize) {for (int i 0; i < numsSize; i) {for (int j i 1; j < numsSize; j) {if (nums[i] nums[j] target) {int* ret malloc(sizeof(int) * 2);ret[0] i, ret…

【Qt 学习笔记】Day1 | Qt 背景介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Day1 | Qt 背景介绍 文章编号&#xff1a;Qt 学习笔记 / 01 文章目录…

C语言程序与设计——复杂结构

结构体 结构体在C语言中是一种重要的数据类型&#xff0c;或者说是一种用户自定义的相同或不同数据类型的集合。可以帮助我们封装一组相关数据&#xff0c;使其数据呈现更直观。例如我们想要统计一个学校学生的基本信息。可以将一个同学的信息按照如下存储。 typedef struct …

结构化绑定optional(C++基础)

结构化绑定 处理多个返回值的操作&#xff1a;C17提出 之前多返回值喜欢用struct来返回。现在会做成元组&#xff0c;下图中设置C17的版本&#xff0c;不要设置错为C语言标准。 #include<iostream> #include<string> #include<tuple> std::pair<std::st…