网络套接字编程(三)(HTTP)

news2024/12/24 20:50:48

gitee仓库:https://gitee.com/WangZihao64/linux/tree/master/CalTcp

一、重谈协议

协议是一种“约定”,这种约定是双方都知道的。有了一致的约定,双方才能够正常地进行通信。协议在网络的第一篇博客中也提到过,协议是双方进行通信的基础,在网络通信中存在着各种协议,有了这些协议,网络的通信才能够正常运转。

这次写一个网络计算器,我们分为几步:

  • 客户端向服务端发送一个请求数据包
  • 服务端将请求数据包进行解析,并且进行业务处理,然后返回一个响应数据包给客户端
  • 客户端将响应数据包进行解析,得到计算结果

客户端将请求封装成一个数据包,该过程叫做序列化,服务端将请求数据包进行解析的过程叫做反序列化。目前市面上有json、xml等格式,都可以供程序员进行该操作。

协议定制以及序列化和反序列化:

  • 请求数据包用一个结构体进行封装,里面有两个操作数和一个操作符
  • 响应数据包也用一个结构体进行封装,里面有计算结果和状态码
class Response
{
public:
    Response()
            :_exitcode(0)
            ,_result(0)
    {}
    Response(int exitcode,int result)
            :_exitcode(exitcode)
            ,_result(result)
    {}
    //结构化->"exitcode result"
    bool serialize(string* str)
    {
        *str="";
#ifdef MYSELF
        string s1=to_string(_exitcode);
        string s2=to_string(_result);
        *str=s1;
        *str+=SEP;
        *str+=s2;
#else
        Json::Value root;
        root["exitcode"]=_exitcode;
        root["result"]=_result;
        Json::FastWriter writer;
        *str=writer.write(root);
#endif
        return true;
    }
    //”exitcode result“ -> 结构化
    bool deserialize(const string& str)
    {
#ifdef MYSELF
        auto mid=str.find(SEP);
        if(mid==string::npos)
        {
            return false;
        }
        string num1_string=str.substr(0,mid);
        string num2_string=str.substr(mid+SEP_LEN);
        if(num1_string.empty()||num2_string.empty())
        {
            return false;
        }
        _exitcode=stoi(num1_string);
        _result=stoi(num2_string);
#else
        Json::Value root;
        Json::Reader reader;
        reader.parse(str,root);
        _exitcode=root["exitcode"].asInt();
        _result=root["result"].asInt();
#endif
        return true;
    }
    int _exitcode; //0:计算成功 !0表示计算失败
    int _result; //计算结果
};

如果你仔细看了之前的文章,那么这次新增的部分就在这里,通常情况下序列化和反序列化不需要我们自己做,这里做只是让读者更加了解何为序列化,整体代码请看我上面放出的gitee链接

二、HTTP协议

介绍

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,本质是基于TCP协议来进行文本设置完成协议通信。HTTP协议支持客户端——服务端模式,也就是请求与响应模式,且客户端需要以浏览器的方式访问服务端。

在这里插入图片描述

URL

统一资源定位符(Uniform Resource Locator),给互联网上的每一个文件资源都贴上这样一个唯一标签,并且包含了资源位置信息和访问方式浏览器可以通过URL中的文件位置信息找到对应的资源文件。

在这里插入图片描述

  • 协议方案名: 发起请求用到的协议
  • 登录信息: 登录认证是用的的信息,通常被忽略
  • 服务器地址: 访问资源所在的服务器的地址,也就是域名(字符串风格的)
  • 端口号: 服务器绑定的端口号
  • 文件路径: 访问资源在目标服务器上的位置信息
  • 查询字符串: 查询信息
  • 片段标识符: 对某些资源信息的描述与补充

http request/response

http响应格式和请求格式,http已经为我们设置好了

在这里插入图片描述

http长连接

我们看到的网页,实际上可能由多种元素构成,一张完成的网页需要多次http请求,浏览器进行组合与渲染,所以网页有100张图片我们得请求http 100次,如果频繁发起http请求,会导致频繁创建连接的问题,需要client和server都要支持长连接,所谓长连接就是,建立好一条连接,获取大份资源的时候,通过一条连接完成,请求报头,Connection选项就是关于长连接的

http会话保持

会话保持严格意义上不是http天然具备的,http协议是无状态的,即不会记录历史记录所输入的状态信息,简单说如果没有会话保持,我们登陆一个网站以后,网页发生跳转就需要重新登陆,但如果有了会话保持就不需要了

那么是如何做到的呢?Cookie技术,它分为文件级别和内存级别,有的网页关闭了,下次登陆你的账号还在,就是文件级别的,如果下次登陆它就不在了,那么就是内存级别的(也有可能是对方设置了缓存的时间,超过这个时间就会重新缓存)

在这里插入图片描述

三、HTTPS

在这里插入图片描述

https协议是在http协议的基础上多了一个加密层

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

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

相关文章

uniapp中H5定位功能实现

1.要实现该功能 必须使用vue-jsonp进行跨域 JSONP是一种跨域数据请求的解决方案,它使用script元素来请求数据,再利用回调函数将数据传回页面。 Vue框架提供了对JSONP的支持,可以方便地在Vue应用中使用JSONP获取跨域数据。下面我们来了解一下…

【Java】StringBuffer和StringBuilder

共同点 他们都是可变的,在每次进行修改操作时,都不会产生新的对象,所以在进行修改的时候,尽量使用这两种类型的字符串 不同点 StringBuffer在单线程中效率高 StringBuilder用于多线程确保安全性 测试代码 public class test …

keepalived安装配置详解

文章目录 高可用介绍keepalived安装、使用vip漂移抓包脑裂脑裂有没有危害?如果有危害对业务有什么影响? keepalived架构双vip架构 Healthcheck实现 notifyVRRP选举格式 高可用 介绍 高可用性(High Availability)是指系统或服务能…

Linux的locale本地化配置

Linux的locale本地化配置 locale简介localectl常用操作语言环境键盘布局 常见问题:配置语言环境报错Linux系统locale(UTF-8)报错最小化自动安装的Centos7修改完整中文显示 locale简介 参考: http://m.blog.chinaunix.net/uid-20621049-id-3427444.html locale把按照所涉及到的…

Python调用ImageMagick生成PDF文件缩略图

使用Python调用ImageMagick生成PDF文件缩略图 Imagemagick使用Ghostscript作为其依赖项之一,以便能够处理和转换PDF相关的图像。 准备 安装Ghostscript,网站安装ImageMagick,网站 安装完毕后,需要自行配置环境路径 脚本 使用示…

灌区信息化智能测控一体化闸门系统解决方案

一、方案背景 闸门是节水灌溉工程中重要组成部分。在农田灌区中,一方面存在传统手摇闸门,未能实现自动化、数字化,另一方面部分灌区闸站虽然部分实现了自动化控制,但是由于闸站较多,有些位置较为偏僻,部分水…

网络数据安全风险评估实施指引(一)

近日,全国信息安全标准化技术委员会发布了《网络安全标准实践指南 网络数据安全风险评估实施指引》(TC260-PG-20231A v1.0-202305),旨在响应《数据安全法》要求,落实重要数据处理过程风险评估,衔接已发布的…

前端开发中的微服务架构设计

前端服务化和小程序容器技术为前端应用带来了更好的组织结构、可维护性和可扩展性。这些技术的应用将促进前端开发的创新和发展,使团队能够更好地应对复杂的前端需求和业务挑战。通过将前端视为一个服务化的架构,我们能够构建出更强大、可靠且可持续的前…

OpenCv (C++) 使用矩形 Rect 覆盖图像中某个区域

文章目录 1. 使用矩形将图像中某个区域置为黑色2. cv::Rect 类介绍 1. 使用矩形将图像中某个区域置为黑色 推荐参考博客:OpenCV实现将任意形状ROI区域置黑(多边形区域置黑) 比较常用的是使用 Rect 矩形实现该功能,代码如下&…

vmware-ubuntu 出现的奇怪问题

虚拟机突然连不上网 参考博文-CSDN-卍一十二画卍(作者)-Vmware虚拟机突然连接不上网络【方案集合】 sudo vim /var/lib/NetworkManager/NetworkManager.statesudo service network-manager stop sudo vim /var/lib/NetworkManager/NetworkManager.stat…

华为云子网路由表作用及价值

子网路由表 子网路由表作用云专线、VPN的配置与子网路由表强关联,本质是在相应的子网路由表中添加了一条路由Nat路由表问题地址变更问题snat和dnat 子网路由表作用 子网内部作为一个二层网络,通过mac地址互通,不通过路由互通。跨子网&#x…

Java Vue物联网系统

一个简单易用的物联网平台,可用于搭建物联网平台以及二次开发和学习。适用于智能家居、智慧办公、智慧社区、农业监测、水利监测、工业控制等。 系统后端采用Spring boot;前端采用Vue;消息服务器采用EMQX; 技术栈 服务端相关技术…

Vector - CANoe - DoIP在CANoe应用

目录 背景说明 一、DoIP通信说明 1、连接(Connection) 2、车辆发现(Vehicle Discovery)

第一阶段-第八章 Python的文件操作

目录 一、文件的编码  1.学习目标  2.文件编码  3.查看文件编码  4.本小节的总结 二、文件的读取  1.学习目标  2.什么是文件  3.文件包含的操作(打开、关闭、读、写)  4.文件的操作步骤(打开或创建文件open(mode…

【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 14 日论文合集)

文章目录 一、检测相关(6篇)1.1 LVLane: Deep Learning for Lane Detection and Classification in Challenging Conditions1.2 Garbage in, garbage out: Zero-shot detection of crime using Large Language Models1.3 Robotic surface exploration with vision and tactile …

汽车电子 -- 使用CANdb++ Editor创建并制作一个DBC

参看:关于DBC文件的创建(DBC文件系列其一) 一、什么是DBC DBC文件是DataBase Container文件的缩写。 CAN数据库文件也称为后缀为(.dbc)的文件。DBC文件是基本的文本文件,其中包括将原始CAN总线数据解码为…

Raft算法之日志复制

Raft算法之日志复制 一、日志复制大致流程 在Leader选举过程中,集群最终会选举出一个Leader节点,而集群中剩余的其他节点将会成为Follower节点。Leader节点除了向Follower节点发送心跳消息,还会处理客户端的请求,并将客户端的更…

音频播放器Web页面代码实例(基于HTML5)

音频播放器Web页面代码实例&#xff08;基于HTML5&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><…

C/C++自定义类型(详解struct,enum,union)

目录 一&#xff0c;struct 1&#xff09;结构及一般使用方法 2&#xff09;无名结构体 3&#xff09;巧用typedef 4)struct小细节 5&#xff09;补充内存对齐&#xff08;提高程序可移植性&#xff0c;提高运行效率&#xff09; 二&#xff0c;enum 1)结构及一般使用方…

H3C-Cloud Lab实验-RIP实验

实验拓扑图&#xff1a; 实验需求&#xff1a; 1. 按照图示配置 IP 地址 2. 配置 RIP 实现全网路由互通 3. 路由器之间需要开启接口身份验证来保证协议安全性&#xff0c;密钥为 123456 实验步骤&#xff1a; 1. 配置R1的IP地址 2. 配置R2的IP地址 3. 配置R3的IP地址 4. 在…