HttpClient I/O exception (java.net.SocketException) caught when processing request: Connect

转自:http://luan.iteye.com/blog/1820054

I/O exception (java.net.SocketException) caught when processing request: Connect

查阅了HttpClient官方的异常说明文档(http://hc.apache.org/httpclient-3.x/exception-handling.html),可以看到以下一段话:

In some circumstances, usually when under heavy load, the web server may be able to receive requests but unable to process them. A lack of sufficient resources like worker threads is a good example. This may cause the server to drop the connection to the client without giving any response. HttpClient throws NoHttpResponseException when it encounters such a condition. In most cases it is safe to retry a method that failed with NoHttpResponseException.

在某些情况下,通常在重负载下时,Web服务器可能能够接收请求,但无法处理它们。缺乏足够的资源,比如工作线程,这可能会导致服务器断开连接的客户端没有给予任何回应。当它遇到这样的条件HttpClient会抛出NoHttpResponseException。此异常是由于服务器端过载而拒绝接受请求(不再响应)所致。

老外有一篇文章,很好的描述了类似代码的性能隐患:《HttpClient容易忽视的细节——连接关闭》

1、英文原文:http://www.codeweblog.com/httpclient-s-easy-to-overlook-the-details-the-connection-is-closed/

2,中文翻译:http://www.iteye.com/topic/234759

总述:实现一个HTTP接口不是件困难的事情,但是如何让这样的HTTP接口在高压力下(短时间内大数据量)也有稳定良好的表现,则不仅仅是HTTP服务器端需要做好设计与优化,而且HTTP客户端方面也同样需要非常谨慎与注意一些代码细节。否则,很有可能因(双方或单方)代码或配置中存在性能隐患,在软硬件环境的配合下就会出现一些“灵异”故障。

【HTTP协议知识

为便于读者理解后文,先简述一些与HTTP性能密切相关的、又常常被工程师们所不深究的HTTP协议基础知识。

一,什么是HTTP KeepAliv 电子邮件

HTTP KeepAlive是就是通常所称的长连接。KeepAlive即服务器端为同一客户端保持连接一段时间(不立即关闭),以便于更多来自于此客户端的后续请求不断的利用此连接直至连接超时。

在HTTP1.0和HTTP1.1协议中都有对的KeepAlive的支持。其中HTTP1.0需要在请求头中增加“连接:保持活动”才能够支持,而HTTP1.1默认支持。

该属性的更多阐述:

1,下一个请求是在完成之前请求的响应被客户端接收的情况下才发出。因此需要在向客户端写完之前的请求的响应后才能触发。

2、HTTP协议是基于TCP协议的,故服务器端与客户端都有可能关闭连接。KeepAlive只是表明了服务器端面对连接的一种优化策略,而客户端也完全可以主动关闭之(不利用)。

二,KEEPALIVE的好处与坏处

KeepAlive带来的好处是可以减少HTTP连接的开销,提高性能。比如,同一页面中如有很多内嵌的图片、JS、CSS等请求,则可以利用此特新性,使用少量的连接数(IE下一般是2个)更快的下载下来,使得网页更快的展示出来。

QeepAlive的坏处是:

如果有大量不同的客户端同时(或瞬间)请求服务器端,且每一个客户端的都长期占用连接(比如:不关闭且ConnectionTimeOut设置过长)或服务器端也不快速失效连接(KeepAliveTimeout参数设置过大)的话,可能会快速占满服务器连接资源,导致更多的请求被排队或被拒绝或服务器down掉。

总结:浏览器作为一种HTTP客户端,充分的、很好的利用了HTTP协议的KeepAlive,让我们的浏览更加快速;而我们自写的HTTP客户端程序在KeepAlive特性(服务器已开启)下,需要以高数据量访问一个HTTP接口的时候,每一次请求应当尽快关闭连接释放资源(重点推荐)或者在同一连接上适当多发几次请求(不推荐)。

【高性能HTTP应用的策略】

所以,当我们需要一个高性能的HTTP接口型应用时:

1,服务器端:关闭KeepAlive功能。

2、服务器端:最好直接支持HTTP协议(注意用POST,不要GET),而不是任何包装过的协议,比如:hessian/soap等。

3、服务器端:在一个请求中,最好设计成:支持多条指令批处理,以节省连接数。

4、服务器端:对请求的处理应当尽可能的快(如在150ms内)。

5、客户端:在代码中,同一个客户端实例中全部请求结束后应主动关闭连接(无须事先设置客户端的ConnectionTimeOut参数)。

6、客户端:如服务器未关闭KeepAlive,在同一个客户端实例中可以适量发出多个请求(总时间应稍小于服务器KeepAliveTimeout参数)。此方式需要精确操作,不推荐。

最后,在接口设计上,对于一些异步操作,尽量不要设计成单方面轮询模式(减少大量无谓请求数),应设计成被调用方的异步结果回调模式。

【一些优化细节】

在服务器端,我们一般选用的是Apache+Tomcat/JBoss的组合。关于JBoss的配置及优化可参看JBoss官网。

最主要的是关于Apache的优化,推荐阅读两篇文章:

1、Apache性能优化:http://www.aliwo.net:8080/2009/12/apache/

2,保持活动的Apache配置中的合理使用:http://www.net527.cn/a/caozuoxitong/Linux/5283.html

在客户端的Java代码中,我们最常使用的是HttpClient工具包。

有一些细节要注意:

1、在每一个HttpClient实例发完请求后,(如不再使用)应及时关闭连接。

最简单的方式是,在HTTP请求头中发送(连接:CLOSE ),指示服务器关闭当前连接。

代码如下:

method.setRequestHeader(“Connectio “,”关闭“);//改了这个,发现性能很差

2、可以设计为单例模式:无需每次创建HttpClient实例,可多次发送请求(请求头设置见第一条

时间: 2024-08-25 12:08:53

HttpClient I/O exception (java.net.SocketException) caught when processing request: Connect的相关文章

Connection reset问题,INFO: I/O exception (java.net.SocketException) caught when processing reques

困扰我多年的Connection reset问题 第一次出现:是thrift的python client去请求server,发现偶尔出现这个问题 第二次:接入第三方的api,去请求数据时,发现一个接入方的api第一次总是报这个错,当时又没有做处理,导致获得信息置空,入缓存后数据就是错误的.做了一个更改就是retry三次,得到解决. 第三次:最近去抓appstore的应用指数又重新出现该问题,使用HttpRequestRetryHandler 重试,设置到20次都无一次成功. 堆栈错误信息: 1

nternal Exception java.net.socketexception Connection Reset Error : A Guide

Copy from http://www.minecraftman.com/internal-exception-java-net-socketexception-connection-reset/ Internal Exception java.net.socketexception Connection Reset Error : A Guide The Internal Exception java.net.socketexception Connection Reset error me

IPv6调用java后端接口报错:java.net.SocketException: Protocol family unavailable

目前需求是java后端的接口需要支持IPv6.先确认linux机器已经绑定了IPv6: CMREAD-SV43 apache-tomcat/bin> ifconfig eth0 Link encap:Ethernet HWaddr 2C:76:8A:AF:9E:82 inet addr:192.168.11.11 Bcast:192.168.11.111 Mask:255.255.255.0 inet6 addr: fe80::2e76:8aff:feaf:9e82/64 Scope:Link

最近纠结致死的一个java报错java.net.SocketException: Connection reset 终于得到解决

Copy from http://www.seotcs.com/blog/796.html 自从SEOTcs系统11月份24日更新了一下SEO得分算法以来,一直困扰我的一个问题出现了,java的数据job任务,在执行过程中会经常报以下的错误: “2011-12-03 18:00:32 DefaultHttpClient [INFO] I/O exception (java.net.SocketException) caught when processing request: Connectio

java.net.SocketException:Software caused connection abort: recv failed 异常分析 +socket客户端&服务端代码

java.net.SocketException:Software caused connection abort: recv failed 异常分析 分类: 很多的技术 2012-01-04 12:54 8004人阅读 评论(6) 收藏 举报 socket服务器bufferstring网络java 第 1个异常是java.net.BindException:Address already in use: JVM_Bind.该异常发生在服务器端进行new ServerSocket(port)(p

Hadoop问题:java.net.SocketException: Network is unreachable

问题描述:Failed on local exception: java.net.SocketException: Network is unreachable; Host Details : local host is: "Master/192.168.43.190"; destination host is: "Master":9000; 问题分析:网络问题,没有联网 问题解决:wifi联网 原文地址:https://www.cnblogs.com/haimis

java.net.SocketException四大异常解决方案

java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题.希望大家有所帮助.那么我们就来看看有关java.net.SocketException的相关知识. 第1个异常是 java.net.BindException:Address already in use: JVM_Bind. 该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时.异常的原因是以为与port一样的一个端口

Android java.net.SocketException四大异常解决方案

java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题.希望大家有所帮助.那么我们就来看看有关java.net.SocketException的相关知识. 第1个异常是 java.net.BindException:Address already in use: JVM_Bind. 该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时.异常的原因是以为与port一样的一个端口

【转】java.net.SocketException

第1个异常是java.net.BindException:Address already in use: JVM_Bind.该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时.异常的原因是以为与port一样的一个端口已经被启动,并进行监听.此时用netstat –an命令,可以看到一个Listending状态的端口.只需要找一个没有被占用的端口就能解决这个问题. 第2个异常是java.net.ConnectException: Co