定义

Http/1.0每次请求都需要建立新的TCP连接,连接不能复用。Http/1.1新的请求可以在上次建立的tcp连接之上发送,连接可以复用。

优点

减少重复进行tcp三次握手的开销,提高效率。注意:在同一个tcp连接中,新的请求需要等上次请求收到响应后,才能发送。

实现

自己写了一个http下载页面的工具,url是以文件的形式批量的进行下载的。支持连接复用下载。

主要的思路

在发送http的请求头中设置Connection: keep-alive。

当前的url与上一次下载的url之间进行对比,如果host相同的话,则用上一次的socket_id。否则关闭上一次的socket,重新连接服务器,获取新的socket。所以,url的文件,需要进行排序,将同一个站点的url放在一起即可。

ps:这里实现的形式比较的简单。复杂一点,可以用一个map,std::map<std::string host,int socket_id>,对host的socket_id进行映射。但是这里需要关注map的<host,socket_id>的失效时间,不能昨天建立的连接一直不关闭,今天仍然在使用,服务器端会有最大的连接时间的限制。例如tomcat中有个 maxKeepAliveRequests属性.默认值是100,该属性表示当同一个连接的请求达到maxKeepAliveRequests的值时会自动断开这个连接. 。多线程的话,还需要关注该socket_id是否正在使用,发送和接收数据。

测试集合

http://news.qq.com/a/20130824/006645.htm

http://news.qq.com/a/20130825/000112.htm

http://news.qq.com/a/20130824/005661.htm

http://view.news.qq.com/intouchtoday/index.htm?2529

http://www.163.com/

测试结果

第二条和第三条url是使用第一条的socket_id进行下载,下载成功。

服务器端超时关闭测试

用了比较笨的方法,在下载每个url中间sleep的方法,来测试长连接关闭的时间,因为本客户端在url下载完之前是不会close(socket_id)的,所以出现连接关闭,应该是服务器端主动关闭的。

测试站点:news.qq.com

当sleep的时间超过30s,tcp连接的状态会从ESTABLISHED变成CLOSE_WAIT。同时用这个socket_id再向服务器端发送数据,也不会收到服务器端的响应。

当sleep的时间为29s,或者小于29s。复用连接下载正常。

由于程序有其他的一些运行的耗时,所以推测news.qq.com的长连接的超时时间是30s。对于长连接来说,超过30s之后,服务器端就会主动断开连接。Http的连接复用也就无法获取结果了。

所以,对于http连接复用,最大的难点也就是准确的获取每个站点的长连接的最大限制时间。超过最大限制时间就必须进行重连,不然会导致请求无反映的情况。

代码下载,请看博客

原创文章,转载请注明: 转载自成长的企鹅

本文链接地址: http 连接复用

关于我:成长的企鹅简介

http 连接复用的更多相关文章

  1. TCP连接复用

    转自网络:看到一陌生名词,记录一下 TCP连接复用技术通过将前端多个客户的HTTP请求复用到后端与服务器建立的一个TCP连接上.这种技术能够大大减小服务器的性能负载,减少与服务器之间新建TCP连接所带 ...

  2. HTTP2.0的多路复用和HTTP1.X中的长连接复用区别

    HTTP/2 多路复用 (Multiplexing)    多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息 HTTP1.1 在HTTP/1.1协议中,浏览器客户端在同一时间,针 ...

  3. 2.jdk1.8+springboot中http1.1之tcp连接复用实现

    接上篇:https://www.cnblogs.com/Hleaves/p/11284316.html 环境:jdk1.8 + springboot 2.1.1.RELEASE + feign-hys ...

  4. http连接复用进化论

    HTTP协议是应用层协议,它定义万维网客户端如何与服务器进行通信.它在传输层的TCP协议的基础上进行数据传输 HTTP 1.0 在HTTP 1.0时代,默认一个http请求对应一个TCP连接,没有任何 ...

  5. 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池)

    一.本文产生原由: 之前文章<总结消息队列RabbitMQ的基本用法>已对RabbitMQ的安装.用法都做了详细说明,而本文主要是针对在高并发且单次从RabbitMQ中消费消息时,出现了连 ...

  6. Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  7. 原来:HTTP可以复用TCP连接

    问题 线上的一个项目会和微信服务器有API请求(目的是获取用户的微信信息),但会有偶发的报错: 'Connection aborted.', ConnectionResetError(104, 'Co ...

  8. 帆软报表FineReport中数据连接的JDBC连接池属性问题

    连接池原理 在帆软报表FineReport中,连接池主要由三部分组成:连接池的建立.连接池中连接使用的治理.连接池的关闭.下面就着重讨论这三部分及连接池的配置问题. 1. 连接池原理 连接池技术的核心 ...

  9. [R语言]R语言使用多线程对数据库进行大批量访问时出现无法连接问题

    问题描述: 在R中使用多线程对数据库进行写入,在服务器端运行脚本(linux环境),总是在第6-7万个任务线程时,出现无法连接到数据库的问题.任务中断,错误信息为task 6xxxx failed,C ...

随机推荐

  1. Android实现视频录制

    安卓实现视频录制,有两种方法,一种是调用自带的视频功能,一种是使用MediaRecorder. 每种方法都有自己的优缺点.接下来,把两种方法的代码写出来. 先说第一种方法,也是最简单的方法,那就是直接 ...

  2. js 字符串为空

    content.replace(/(^\s)|(\s$)/g, "")

  3. java volatile关键字的理解

    转载:http://shmilyaw-hotmail-com.iteye.com/blog/1672779 一个多线程的示例引发的问题 在讨论这个关键字之前先看一个多线程的示例代码: public c ...

  4. 子进程管理模块subprocess

    subprocess模块允许你生成子进程,连接管道,并获取返回的代码. 一.使用subprocess模块 模块中定义了一个Popen类:       subprocess.Popen(args, bu ...

  5. QT 程序自定义插件

    1,定义接口文件 /****************************************************************************************** ...

  6. [LeetCode]题解(python):021-Merge Two Sorted Lists

    题目来源: https://leetcode.com/problems/merge-two-sorted-lists/ 题意分析: 题目给出两个排好序的链表,将这两个链表整合成一个新的有序的链表. 题 ...

  7. pip install 出现报asciii码错误的解决

    原因是pip安装python包会加载我的用户目录,我的用户目录恰好是中文的,ascii不能编码.解决办法是: python目录 Python27\Lib\site-packages 建一个文件site ...

  8. 转:从pickle看python类成员的动态加载和类的定位

      pickle是Python轻便的对象序列化工具.使用pickle可以方便地把python对象写入文件对象中,或者像soap那样在socket间传送.     按照python的一贯作风,类的成员在 ...

  9. hdu1533解题报告

    题意:这里有一个N*M的方格图.....图中m代表人,H代表房子...并且人数和房子的数量是相等的..那么.每个人可以竖直或者横向走一格,并且花费1S元...那么为了让所有的人进入房子,求解最小的花费 ...

  10. 公共 DNS server IP 地址

    公共 DNS server IP 地址 名称 DNS server IP 地址 CNNIC SDNS 1.2.4.8 210.2.4.8 114 DNS 114.114.114.114 114.114 ...