文档章节

一个支持并发, 支持异步/同步, 支持http/https, 支持续传的avhttp

Jackarain
 Jackarain
发布于 2013/02/24 00:00
字数 838
阅读 6021
收藏 79

起源

问题起源于 microcai 和 jack 的一次谈话。他们注意到了 HTTP 多线程下载模式,其实本质上不过是向服务器发起了多个TCP连接。使用一个线程一样能完成这样的工作——只要他们使用的是异步方式进行的。boost.asio 是一个非常优秀的异步网络库,要是能基于 asio 开发,就能实现单线程并发下载。得益于asio的良好架构,如果单线程性能不足的时候,只需要简单的开启多个线程跑 asio::io_service::run() 即可。这样是进行多线程还是单线程都可以由用户灵活的控制。


引线

虽然 jack 和 microcai 意识到了一个基于 asio 的并发 HTTP 下载库的重要性。但是真正导致他们动手的原因却是一个女人 —— 猫是也。

猫据说希望开发一个某客户端,需要用到多线程HTTP下载功能,于是向社区列位大牛求救。 microcai 告诉她,jack在一份私有项目里实现过一个多线程 HTTP 下载代码,找他要一下, jack 说不定能剥离出来给猫用。

jack 说剥离太麻烦了,反正一直有个想用 asio 重写一个 HTTP 并发下载库的想法,不如重复发明一下轮子,用 asio 的方式彻底重写一个满意的HTTP库。

恰逢 avbot 的 WebQQ 协议需要 HTTP 库,但是基于 asio 的 HTTP库目前只有urdl (也是asio作者的大作,可惜已经不维护了)可以用,于是勉强用了这个早就停止开发的urdl,而且修修补补才勉强凑合使用。

重写一个真正合用的基于asio的异步HTTP库确实能帮助avbot项目,于是microcai也赞成jack的决定。了解microcai脾气的人都知道,microcai是一个坚定的反轮子党——一切重复发明轮子的行为都要被他批判。

命名

通过讨论,决定将库的名称命名为avhttp。av是avplayer.org社区项目的标志性前缀,http表示他是一个用于支持HTTP协议的库。

设计

avhttp由2大部分组成:avhttp::http_stream 和avhttp::multi_download。

  • avhttp::http_stream是一个异步HTTP实现。每个http_stream对象支持一个HTTP会话。这个http_stream也是 avbot 所需要的。
  • avhttp::multi_download 利用http_stream进行HTTP访问,内部通过调度逻辑组合,将复杂的多TCP下载逻辑都封装起来。

另外包含一些支持类,比如 avhttp::url 用于解析URI字符串,avhtt::request_opts 用户设置HTTP请求头。

实现

jack 承当了主要的编码工作。microcai懒人只负责骂jack,尤其是他作出了错误的技术决定的时候。 当 http_stream 接近完成的时候, microcai 以迅雷不及掩耳之速度将 avbot 移植到 avhttp 上。并利用变态的腾讯服务器做了第一个测试。找到了许多意料之外的bug。这个bug故事"恐怕要消失在历史了"。

使用

avhttp 是HeaderOnly 的库,使用的时候不需要编译,也不用添加库。只需要 #include <avhttp.hpp> 即可开始享受

TO BE CONTINED ...

源码见: https://github.com/avplayer/avhttp



© 著作权归作者所有

Jackarain

Jackarain

粉丝 225
博文 17
码字总数 10627
作品 4
杭州
私信 提问
加载中

评论(18)

Jackarain
Jackarain 博主

引用来自“爱吃大肉包”的评论

写的有点烂,勿见笑,不过确实可以用,原理也简单,就是把一个资源切分成N个资源的。然后用N个线程去下载byte数组,最后还原下资源

不好意思, 我不懂java
爱吃大肉包
爱吃大肉包
写的有点烂,勿见笑,不过确实可以用,原理也简单,就是把一个资源切分成N个资源的。然后用N个线程去下载byte数组,最后还原下资源
爱吃大肉包
爱吃大肉包
不知道你说的是不是这意识,我以前开过个,JAVA写的,也是多线程下载,不过没很完善。基本功能而已,附上地址 https://github.com/bensonHe/Download4Http
幻の上帝
幻の上帝
未必需要依赖boost。asio有非boost的版本。剩下的基本用C++11的std也差不多了。
预兆师
预兆师
我还以为是我的问题呢。鼠标变成十字了。
Jackarain
Jackarain 博主

引用来自“小耶果”的评论

依赖boost不爽!

不是c++程序员, 当然会不喜欢boost啊
Jackarain
Jackarain 博主

引用来自“USIDCBBS”的评论

libcurl其实不错了

curl不能异步, 不能并发
小耶果
小耶果
依赖boost不爽!
USIDCBBS
USIDCBBS
libcurl其实不错了
红红
红红

引用来自“Jack.arain”的评论

引用来自“红红”的评论

支持断点续传吗

居然没看标题...

....
avhttp终于支持了gzip/chunked

Chunked 也叫分块传输编码, 是http 1.1中的内容, 其好处有以下: HTTP分块传输编码允许服务器为动态生成的内容维持HTTP持久链接。通常,持久链接需要服务器在开始发送消息体前发送Content-Len...

Jackarain
2013/05/07
1K
0
avhttp的第一期目标总算完成了, 发个贴感叹一下.

很多很多时候, 我们都需要用到http协议, 而在c/c++中, 好用的开源http开发库大概没几个, 比较全面的就属curl了, 我相信这个库很多人都使用过, 不过它的api接口在我看来并不友好, 繁琐和难以理...

Jackarain
2013/05/12
2.2K
14
C++语言的HTTP开发包--avhttp

avhttp avhttp是一个基于Boost.Asio实现的HTTP客户端开发工具库. 简介 它支持HTTP(1.0/1.1)、HTTPS, 断点续传, 多线程并发下载, 异步, HTTP/SOCKS4/SOCKS5代理支持等特性, 开发者可以轻松的基...

Jackarain
2013/02/25
6.6K
0
异步RPC框架--Missian

大家都知道,Hessian是一个了不起的RPC框架。但是,它的调用是同步的,并且只能基于HTTP传输。 作者创建missian(mina+hessian的意思)的目的有二: 1、实现异步的RPC调用。同步远程操作带来...

匿名
2010/11/29
10.7K
1
go-fastdfs v1.3.4 重大发布,优化并发上传内存占用

go-fastdfs是一个基于http协议的分布式文件系统,它基于大道至简的设计理念,一切从简设计,使得它的运维及扩展变得更加简单,它具有高性能、高可靠、无中心、免维护等优点。 注意:使用前请...

s_jqzhang
11/01
1K
5

没有更多内容

加载失败,请刷新页面

加载更多

什么样的人要学点python编程?请你对号入座

什么样的人需要学点python编程? 时代越来越不一样了,编程这种专业程序员的工作,已经开始应用于各种其他日常工作中,就以前象征着互联网的电脑,现在早已进入普通人家。 那么什么样的人需要...

这人就爱编程
28分钟前
3
0
哪吒之魔童降世的背景音乐怎么提取 视频中提取音频的方法

随着国漫的不断崛起一大批优质的动漫正向我们袭来,从大鱼海棠到大圣归来再到我们现在的哪吒让我们看到国漫质的飞跃,也让我们对国漫充满信心,前段时间哪吒之魔童降世以国产第二的票房下线到...

cenfeng123
32分钟前
3
0
springcloud 整合 springboot-admin 监控中心

Admin监控应用 Spring Boot提供的监控接口,例如:/health、/info等等,实际上除了之前提到的信息,还有其他信息业需要监控:当前处于活跃状态的会话数量、当前应用的并发数、延迟以及其他度...

java框架开发者
34分钟前
2
0
GMAT阅读提分要看课外读物,名师点评正确使用方法

阅读提分需要从积累阅读量开始,这种积累不能只靠做练习,还需要大量阅读课外读物。而最适合GRE考生的课外读物之一就是原版杂志。但看课外读物提分也要讲究方法。下面小编就为大家详解看课外...

bole6
37分钟前
1
0
第六次读Kingfisher网络图片缓存库的思考与感受(稍微有点起色)

这节我们来优化一下之前的 硬盘存储,看看kingfiisher哪里做得好,我们稍微来学习一下。 从硬盘里检索图片模仿改进: open func retrieveImageInDiskCache(forKey key: String, options:...

T型人才追梦者
37分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部