背景 最近项目测试遇到个奇怪的现象,在测试环境通过 Apache HttpClient 调用后端的 HTTP 服务,平均耗时居然接近 39.2ms。可能你乍一看觉得这不是很正常吗,有什么好奇怪的?...因此在本地使用 Apache HttpClient 写了个简单 Test 程序,直接调用后端的 HTTP 服务,发现平均耗时在 55ms 左右。咦,怎么跟测试环境 39.2ms 的结果有点区别。...期间怀疑过 Apache HttpClient 是不是有什么地方使用的不对,因此使用 JDK 自带的 HttpURLConnection 写了简单的程序,做了测试,结果一样。 4....对,你猜的没错,就是 TCP_NODELAY。 那调用方和被调用方哪边的程序没有设置呢? 调用方使用的是 Apache HttpClient ,tcpNoDelay 默认设置的就是 true。...在 Linux 系统中,默认这个延迟时间是 40ms; 如果在等待发送 ACK 期间,对方的第二个数据包又到达了,这时要立即发送 ACK。
这些服务调用都是通过 HttpClient 工具直接调用的,对 Spring RestTemplate 做了一次封装,其底层也是调用的 Apache HttpClient 工具类来实现服务调用的。...【这是 TCP 第一次握手,小东状态此时处于 syn_sent 状态】 2)小升收到了小东的聊天网络包,你得确认下吧,表示你收到了。...然后,激动的做了个回复「 针对小东发来的 sync 包,做了个 ack 回复确认」。因隔了一段时间了,小升也不确定小东还在不在线了。...【小东状态此时处于 fin_wait1 状态,这是 TCP 第一次挥手】 2)小升收到了小东的 fin1 包,回复了 ack 确认消息。...【此时,小升状态处于 last_ack 状态,这是 TCP 第三次挥手】 4)小东针对小升发来的 fin2 包,最终回复了个 ack 确认。
(ReflectionSocketFactory.java:139) ~[commons-httpclient-3.1.jar:na] at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket...(DefaultProtocolSocketFactory.java:125) ~[commons-httpclient-3.1.jar:na] at org.apache.commons.httpclient.HttpConnection.open...那么为什么HttpClient访问时端口会分配到CLOSE_WAIT对应的端口?...对于四次挥手过程中,当主动方接收到被动放的关闭确认信号FIN后,主动方会回复一个ACK信号,然后会进入TIME_WAIT状态,此时会等待2MLS,在Linux中也就是60s,因此相对上述2000多个活跃...然后为什么TCP主动方关闭后需要等待2MLS?
一、HttpClient简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包, 并且它支持...官方站点:http://hc.apache.org/ 最新版本4.5 http://hc.apache.org/httpcomponents-client-4.5.x/ 官方文档: http...虽然在 JDK 的 java net包中 已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。...HttpClient 是 Apache Jakarta Common 下的子 项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议...现在HttpClient最新版本为 HttpClient 4.5 (GA) (2015-09-11)。
IP与端口连接对,确认对方服务器IP地址。...:既然每次都手动关闭了连接,为什么还会有大量CLOSE_WAIT状态的连接存在呢?...而通过对接口的抓包我们发现,响应头里有Connection:keep-live字样,那我们就可以重点从HttpClient对长连接的管理入手来进行代码分析。...接着我们就看到了HttpClient关闭空闲连接的具体实现,里面有我们想要看到的内容:此时,我们可以得出第一个结论:可以在初始化连接池的时候,通过实现带参的PoolingHttpClientConnectionManager...【pending】:等待连接的容器,其实该容器只是在等待连接释放的时候用作阻塞线程,下文也不会再提到,感兴趣的可以参考具体实现代码,其与connectionRequestTimout相关。
区分HttpClient 3.x 和 HttpClient 4.x 的jar包 如下图所示,如果是HttpClient 3.x 在项目中需要引入 import org.apache.commons.httpclient...另外关于3.x和4.x的jar包依赖,在上图中可以看出,3.x的jar依赖于commons-logging和commons-codec。...HttpClient的常量类直接来使用,具体的详细常量参照下面的链接: 3.x 版本 https://hc.apache.org/httpclient-3.x/apidocs/constant-values.html...对于HttpClient 4.5.x 之后的版本废弃API版本替代策略(针对SSL相关API) HttpClient4.5之后依然有很多的变化,其中一些API也废弃掉了。...HttpClient 4.5.x 之后 Deprecated 废弃API 的替代对应策略:https://blog.csdn.net/dietime1943/article/details/86705539
除了本文推荐的几种方式,强烈推荐 OkHttp 目前JAVA实现HTTP请求的方法用的最多的有两种:一种是通过HTTPClient这种第三方的开源框架去实现。...HTTPClient对HTTP的封装性比较不错,通过它基本上能够满足我们大部分的需求。...HttpClient3.1 是 org.apache.commons.httpclient下操作远程 url的工具包,虽然已不再更新,但实现工作中使用httpClient3.1的代码还是很多,HttpClient4.5...是org.apache.http.client下操作远程 url的工具包,最新的; 另一种则是通过HttpURLConnection去实现,HttpURLConnection是JAVA的标准类,是JAVA...json或者其他格式,此时我们则需要更改请求头及参数的设置信息,以httpClient4.5为例,更改下面两列配置: httpPost.setEntity(new StringEntity("你的json
围绕下面几个点展开: 什么是HttpClient HttpClient入门实例 复杂应用 结束语 一、什么是HttpClient 度娘说: HttpClient 是Apache Jakarta...Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。...根据百度给出的HomePage是这个:http://hc.apache.org/httpclient-3.x/,但是进入后你会发现有句话 大意是:Commons HttpClient这个项目已经不再维护了...也就是说我们以后要用的话就用新的。点这个Apache HttpComponents的链接进去能看到它最新的版本是4.5,而且有快速上手的例子和专业的说明文档。...别着急,慢慢往下看 三、复杂应用 第二个网站访问不了,是因为网站有反爬虫的处理,怎么绕过他呢?
为什么使用HttpClient4?主要是HttpConnection没有连接池的概念,多少次请求就会建立多少个IO,在访问量巨大的情况下服务器的IO可能会耗尽。...HttpClient4在这点上做了改进,使用我们常用的InputStream.close()来确认连接关闭(4.1版本之前使用entity.consumeContent()来确认内容已经被消耗关闭连接)...这里为什么要特别提到route最大连接数这个参数呢,因为这个参数的默认值为2,如果不设置这个参数值默认情况下对于同一个目标机器的最大并发连接只有2个!...这意味着如果你正在执行一个针对某一台目标机器的抓取任务的时候,哪怕你设置连接池的最大连接数为200,但是实际上还是只有2个连接在工作,其他剩余的198个连接都在等待,都是为别的目标机器服务的。...HttpClient4.X 教程下载: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/httpclient-contrib
: 第一个参数:欲编码的中文字符串 ?...第二个参数:编码方式 对于get方式进行网络编程大家应该很熟悉了。其实就是直接在url链接中直接增加键值对参数,请求这个页面就可以了。 而往往有时候为了安全考虑,一般需要进行post请求。...使用面向对象的HttpClient进行链接网络 HttpClient是Apache小组维护的一个项目,相较于原生http请求来说,Httpclient更易用方便,更高效。...我们进行使用的时候首先要下载第三方jar包,包地址:http://hc.apache.org/downloads.cgi 下载完毕后把其中lib文件夹中jar文件,复制到项目中: 选择jar文件---右键...此时就可以使用HttpClient了 ? Get请求 POST请求 ? 这节教程先写到这里吧,虽然篇幅不大,但是知识点很重要,需要大家好好消化。如有什么问题直接在下方讨论区域,评论。 ?
我们使用 Httpclient 时常用的请求有2个,HttpPost 和 HttpGet,一般 HttpPost 对传参 Json 的处理是: HttpPost httpPost= new HttpPost...image.png 这里解决的方案是:重写一个自己的 HttpDeleteWithBody 类,继承自 HttpEntityEnclosingRequestBase,覆盖其中的 getMethod 方法...HttpDeleteWithBody.java import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import...-- 添加httpClient工具包 --> org.apache.httpcomponents...>httpmime 4.5 End.
以下是基于java,分别通过HttpClient、Dubbo、Selenium、JdbcTemplate实现Http、RPC、UI、SQL操作的示例代码。导入依赖包后可直接复制代码执行。...一、实现HTTP接口调用 简介 使用HttpClient实现Http接口的调用,可用于接口自动化,也可用于接口测试。 依赖包 org.apache.httpcomponents httpclient...invoke方法可以代替原方法使用 //第一个参数是需要调用的方法名,queryByUserId //第二个参数是需要调用的方法的参数类型数组,为String数组,里面存入参数的全类名...、获取excel的值 依赖包 <!
”按钮,等待Android Studio识别并导入ADT工程。...),则编译会报错“程序包org.apache.http.client不存在”。...' compile 'org.apache.httpcomponents:httpclient:4.5' 如果SDK的编译版本compileSdkVersion大于等于23,则因为6.0以上(...含6.0)的SDK不再包含httpclient库,故而还要在android节点补充下面一行: useLibrary 'org.apache.http.legacy' 3、关于buildToolsVersion...关于重复引用jar包或依赖库的问题 如果发现打包时报错“com.android.dex.DexException: Multiple dex files define Landroid/support
背后的原因 为什么延迟不高不低正好 40ms 呢?果断 Google 一下找到了答案。...MSS 小的时候(外层的 else 分支),还要再判断 时候还有未确认的数据。...只有当管道里还有未确认数据的时候才会进入缓冲区,等待 Ack。...这时发送端发送第二个包,而队列里还有未确认的数据 包,所以进入了内层 if 的 then 分支,这个 packet 会被缓冲起来。...此时,发 送端在等待接收端的 Ack;接收端则在 Delay 这个 Ack,所以都在等待,直到接 收端 Deplayed Ack 超时(40ms),此 Ack 被发送回去,发送端缓冲的这个 packet
一、HttpClient是什么 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持...HttpClient 已应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。...import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.methods.GetMethod; import...在创建了PostMethod的实例之后,需要给method实例填充表单的值,在BBS的登录表单中需要有两个域,第一个是用户名(域名叫id),第二个是密码(域名叫passwd)。...七、代理器 HttpClient中使用代理服务器非常简单,调用HttpClient中setProxy方法就可以,方法的第一个参数是代理服务器地址,第二个参数是端口号。
在Apache的HttpClient包中,有三个设置超时的地方: /* 从连接池中取连接的超时时间*/ ConnManagerParams.setTimeout(params, 1000); /连接超时...HttpConnectionParams.setSoTimeout(params, 4000); 第一行设置ConnectionPoolTimeout: 这定义了从ConnectionManager管理的连接池中取出连接的超时时间...Httpclient包中通过一个异步线程去创建与服务器的socket连接,这就是该socket连接的超时时间,此处设置为2秒。...第三行设置SocketTimeout: 这定义了Socket读数据的超时时间,即从服务器获取响应数据需要等待的时间,此处设置为4秒。...connectionTimeout:指的是连接一个url的连接等待时间。 soTimeout:指的是连接上一个url,获取response的返回等待时间。
这个库为Scoreoid Rest APIs提供了一个友好的.Net包装器,并且使用了我们的可移植 HttpClient NuGet包。...FanArt Portable – 一个开发人员可以用于访问fanart.tv 电影,TV和音乐图片资源的可移植类库。它也使用了可移植HttpClient包。...它也使用了可移植HttpClient包。 LiveSDKHelper – 一个帮助类库,让微软Live SDK的使用变得更加容易。它包含了那些能够被反序列化的Live SDK响应的强类型。...Microsoft.Bcl.Async – 准备好了底层平台的等待/异步。...最近至少在2种场合下,我都听到过演说者告诉他们的听众,你不能通过一个可移植类库去引用一个特定目标的 .NET类库(例如像.Net Framework4.5的类库)。
领取专属 10元无门槛券
手把手带您无忧上云