iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ 实现高性能HTTP客户端
  • 852
分享到

C++ 实现高性能HTTP客户端

2024-04-02 19:04:59 852人浏览 独家记忆
摘要

目录一、什么是Http Client二、请求的过程1. 创建Http任务2. 填写header并发出3. 处理返回结果三、高性能的基本保证1. 异步调度模式2. 连接复用3. 解锁其

一、什么是Http Client

Http协议,是全互联网共同的语言,而Http Client,可以说是我们需要从互联网世界获取数据的最基本方法,它本质上是一个URL到一个网页的转换过程。而有了基本的Http客户端功能,再搭配上我们想要的规则和策略,上至内容检索下至数据分析都可以实现了。

继上一次介绍用Workflow可以10行c++代码实现高性能HTTP服务,今天继续给大家用C++实现一个高性能的Http客户端也同样很简单!


// [http_client.cc]
#include "stdio.h"
#include "workflow/HttpMessage.h"
#include "workflow/WFTaskFactory.h"

int main (int arGC, char *argv[])
{
    const char *url = "https://GitHub.com/soGou/workflow";
    WFHttpTask *task = WFTaskFactory::create_http_task (url, 2, 3,
            [](WFHttpTask * task) { 
                fprintf(stderr, "%s %s %s\r\n",
                        task->get_resp()->get_http_version(),
                        task->get_resp()->get_status_code(),
                        task->get_resp()->get_reason_phrase());
    });
    task->start();
    getchar(); // press "Enter" to end.
    return 0;
}

只要安装好了Workflow,以上代码即可以通过以下命令编译出一个简单的http_client:


g++ -o http_client http_client.cc --std=c++11 -lworkflow -lssl -lcrypto -lpthread

根据Http协议,我们执行这个可执行程序 ./http_client,就会得到以下内容:


HTTP/1.1 200 OK

同理,我们还可以通过其他api来获得返回的其他Http header和Http body,一切内容都在这个 WFHttpTask 中。而因为Workflow是个异步调度框架,因此这个任务发出之后,不会阻塞当前线程,外加内部自带的连接复用,从根本上保证了我们的Http Client的高性能。

接下来给大家详细讲解一下原理~

二、请求的过程

1. 创建Http任务

上述demo可以看到,请求是通过发起一个Workflow的Http异步任务来实现的,创建任务的接口如下:


WFHttpTask *create_http_task(const std::string& url,
                             int redirect_max, int retry_max,
                             http_callback_t callback);

第一个参数就是我们要请求的URL。对应的,在一开始的示例中,我们的重定向次数redirect_max是2次,而重试次数retry_max是3次。第四个参数是一个回调函数,示例中我们用了一个lambda,由于Workflow的任务都是异步的,因此我们处理结果这件事情是被动通知我们的,结果回来就会调起这个回调函数,格式如下:


using http_callback_t = std::function<void (WFHttpTask *)>;

2. 填写header并发出

我们的网络交互无非是请求-回复,对应到Http Client上,在我们创建好了task之后,我们有一些时机是处理请求的,在Http协议里,就是在header里填好协议相关的事情,比如我们可以通过Connection来指定希望得到建立Http的长连接,以节省下次建立连接的耗时,那么我们可以把Connection设置为Keep-Alive。示例如下:


protocol::HttpRequest *req = task->get_req();
req->add_header_pair("Connection", "Keep-Alive");
task->start();

最后我们会把设置好请求的任务,通过 task->start(); 发出。最开始的 http_client.cc 示例中,有一个 getchar(); 语句,是因为我们的异步任务发出后是非阻塞的,当前线程不暂时停住就会退出,而我们希望等到回调函数回来,因此我们可以用多种暂停的方式。

3. 处理返回结果

一个返回结果,根据Http协议,会包含三部分:消息行、消息头header、消息正文body。如果我们想要获取body,可以这样:


const void *body;
size_t body_len;
task->get_resp()->get_parsed_body(&body, &body_len); 

三、高性能的基本保证

我们使用C++来写Http Client,最香的就是可以利用其高性能。Workflow对高并发是如何保证的呢?其实就两点:

纯异步;

连接复用;

前者是对线程资源的重复利用、后者是对连接资源的重复利用,这些框架层级都为用户管理好了,充分减少开发者的心智负担。

1. 异步调度模式

同步和异步的模式直接决定了我们的Http Client可以有多大的并发度。为什么呢?通过下图可以先看看同步框架发起三个Http任务,线程模型是怎样的:

网络延迟往往非常大,如果我们在同步等待任务回来的话,线程就会一直被占用。这时候我们需要看看异步框架是如何实现的:

如图所示,只要任务发出之后,线程即可做其他事情,我们传入了一个回调函数做异步通知,因此等任务的网络回复收完之后,再让线程执行这个回调函数即可拿到Http请求的结果,期间多个任务并发出去的时候,线程是可以复用的,轻松达到几十万的QPS并发度。

2. 连接复用

我们刚才有提到,只要我们建立了长连接,即可提高效率。为什么呢?因为框架对连接有复用。我们先来看看如果一个请求就建立一个连接,会是什么样的情况:

很显然,占用大量的连接是对系统资源的浪费,而且每次都要做connect以及close是非常耗时的,除了TCP常见的握手以外,许多应用层协议建立连接的过程也会相对复杂。但使用Workflow就不会有这样的烦恼,Workflow会在任务发出的时候自动查找当前可以复用的连接,如果没有才会自动创建,完全不需要开发者关心连接如何复用的细节:

3. 解锁其他功能

当然,除了以上的高性能以外,一个高性能的Http Client往往还有许多其他的需求,这里可以结合实际情况与大家分享:

  • 1.结合workflow的串并联任务流,实现超大规模并行抓取;
  • 2.按顺序或者按指定速度请求某个站点的内容,避免请求过猛被封禁;
  • 3.Http Client遇到redirect可以自动帮我做跳转,一步到位请求到最终结果;
  • 4.希望通过proxy代理访问HTTPHTTPS资源;

以上这些需求,要求框架对于Http任务的编排有超高的灵活性,以及对实际需求(比如redirect、ssl代理等功能)有非常接地气的支持,这些Workflow都已经实现。

项目地址

https://github.com/sogou/workflow

到此这篇关于C++ 实现高性能HTTP客户端的文章就介绍到这了,更多相关C++ 实现HTTP客户端内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++ 实现高性能HTTP客户端

本文链接: https://www.lsjlt.com/news/133556.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 实现高性能HTTP客户端
    目录一、什么是Http Client二、请求的过程1. 创建Http任务2. 填写header并发出3. 处理返回结果三、高性能的基本保证1. 异步调度模式2. 连接复用3. 解锁其...
    99+
    2024-04-02
  • PHP高级特性:HTTP客户端与服务器实战
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-16
  • FTP客户端c代码功能实现
    现在市面上有很多免费的FTP软件:如FileZilla ,那如果想自己在代码中实现与ftp服务器的上传下载文件该如何实现那?  本质上ftp协议就是TCP基础上建立的一种协议,具体如下。 FTP 概述 文件传输协议(FTP)作为网络共享文件...
    99+
    2023-09-24
    服务器 网络 linux
  • C#实现MQTT服务端与客户端通讯功能
    关于MQTT MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设...
    99+
    2024-04-02
  • Node.js中怎么实现http请求客户端
    这期内容当中小编将会给大家带来有关Node.js中怎么实现http请求客户端,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Node.JS有一个request模块,可以很方...
    99+
    2024-04-02
  • 使用GoHTTP客户端打造高性能服务
    目录问题一:默认的 HTTP Client 问题二:默认的 Http Transport 总结 HTTP(超文本传输协议)是一种用于客户端和服务器之间传输数据的通信协议。如果想要访问...
    99+
    2024-04-02
  • C#用websocket实现简易聊天功能(客户端)
    本文实例为大家分享了C#用websocket实现简易聊天功能的具体代码,供大家参考,具体内容如下 前言 使用C#语言进行开发,基于.NET FrameWork4功能包含群聊,和私聊参...
    99+
    2024-04-02
  • 10行C++代码实现高性能HTTP服务
    目录前言实战(干货)总结项目地址前言 是不是觉得C++写个服务太累,但又沉迷于C++的真香性能而无法自拔?作为一个老牌C++程序员(可以看我 github 上十几年前的C++项目:...
    99+
    2024-04-02
  • C#如何实现MQTT服务端与客户端通讯功能
    这期内容当中小编将会给大家带来有关C#如何实现MQTT服务端与客户端通讯功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。关于MQTTMQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 2...
    99+
    2023-06-29
  • C#编写网游客户端的实现
    目录一、项目初步设置 二、连接服务器三、发送数据四、播放背景音乐五、实现游戏背景图片变换六、总结参考一、项目初步设置 1. 新建项目 新建一个WIndows 窗体应用(.Net F...
    99+
    2024-04-02
  • 详解Golang语言HTTP客户端实践
    目录HTTP客户端封装 测试脚本 测试服务 最近在学习Golang语言,中间遇到一个前辈指点,有一个学习原则:Learning By Doing。跟我之前学习Java的经验高度契合。...
    99+
    2024-04-02
  • Go语言怎么实现HTTP服务器和客户端
    在Go语言中,可以通过使用标准库中的"net/http"包来实现HTTP服务器和客户端。 下面是一个简单的HTT...
    99+
    2024-04-12
    Go语言 服务器
  • python实现ssh客户端
    以下程序均来自《Python.UNIX和Linux系统管理指南》ssh有两种登陆方式,一种是使用用户名、密码方式,另一种是使用加密,不再使用密码使用用户名、密码方式,前提是曾经ssh登陆过远程机器,在用户目录的.ssh目录下的known_h...
    99+
    2023-01-31
    客户端 python ssh
  • C#以太网Sockets客户端设计实现
    目录【1】客户端对象【2】初始化【3】连接【4】收发【5】断开【1】客户端对象 using System.Net;// DNS_静态对象 using System.Net.Socke...
    99+
    2023-02-06
    C#以太网Sockets客户端 C#以太网Sockets
  • C++实现一个简单的SOAP客户端
    目录1、简介2、实现客户端2.1 准备xml文件2.2 引入库文件2.3 构建请求数据的xml2.4 执行Http协议的POST方法2.5 解析响应数据的xml3、测试客户端1、简介...
    99+
    2024-04-02
  • 如何实现C#服务端与客户端连接
    今天就跟大家聊聊有关如何实现C#服务端与客户端连接,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C#服务端与客户端连接实现的时间性:当服务器开始对端口侦听之后,便可以创建客户端与它建...
    99+
    2023-06-17
  • Java实现websocket客户端
    常规情况下,大多数时候Java后台作为websocket服务端,实现方式也比较简单,网上很多案例代码。但是很多时候项目中服务与服务之间也需要使用websocket通信,此时项目就需要实现客户端功能。 步骤一:导入依赖: org.jav...
    99+
    2023-10-23
    java websocket 开发语言
  • Python MQTT客户端实现
    如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:12951803 1.安装paho-mqtt 使用Python Package Index (PyPi) pip install ...
    99+
    2023-01-31
    客户端 Python MQTT
  • 怎么在C#中使用MJPEG实现一个客户端功能
    怎么在C#中使用MJPEG实现一个客户端功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。环境:服务端MJPEG服务器使用的是手机的DroidCam,很方便的一个MJPEG服务...
    99+
    2023-06-06
  • node.js+postman实现模拟HTTP服务器与客户端交互
    目录一、node搭建HTTP服务器二、HTTP服务器处理get请求1、postman发送get请求2、服务器解析三、HTTP服务器处理post请求1、postman发送post请求2...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作