`
guzizai2007
  • 浏览: 358787 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

 
阅读更多

异常信息:

org.apache.http.conn.HttpHostConnectException: Connection to http://xxx.xxxx.com refused
	at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:190)
	at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294)
	at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:645)
	at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:480)
	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)
	at com.hcit.SendNoYdMobile.run(SendNoYdMobile.java:91)
	at java.util.TimerThread.mainLoop(Timer.java:512)
	at java.util.TimerThread.run(Timer.java:462)
Caused by: java.net.ConnectException: Connection timed out
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
	at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
	at java.net.Socket.connect(Socket.java:529)
	at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:127)
	at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
	... 9 more

 高峰期时通常报这样的错:

2013-03-01 16:34:50[ INFO] org.apache.http.impl.client.DefaultHttpClient -->I/O exception (java.net.SocketException) caught when processing request: Connection reset
2013-03-01 16:34:50[ INFO] org.apache.http.impl.client.DefaultHttpClient -->Retrying request

 

 引自:http://blog.sina.com.cn/s/blog_3cdcd4a90100j0xf.html

 【一个故障引发的话题】

最近,项目中的短信模块收到一个故障日志,要求我协助调查一下:

2010-05-07 09:22:07,221 [?:?] INFO  httpclient.HttpMethodDirector - Retrying request

:org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(Unknown Source)

2010-05-07 09:22:07,223 [?:?] INFO  httpclient.HttpMethodDirector - I/O exception (org.apache.commons.httpclient.NoHttpResponseException) caught when processing request: The server sms failed to respond

:org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(Unknown Source)

 

查阅了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实例,可多次发送请求(请求头设置见第一条)

 

查看Apache并发连接数及其TCP连接状态

http://koda.iteye.com/blog/1130495

Linux下高并发socket最大连接数所受的各种限制

http://blog.csdn.net/guowake/article/details/6615728

[linux] 查看tcp连接数及状态  

http://xukaizijian.blog.163.com/blog/static/170433119201132910162393/

 

分享到:
评论

相关推荐

    JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES解决方法

    JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES解决方法 JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES错误是一种常见的网络编程错误,发生在Java应用程序中, especialmente 在 Linux 操作系统中。该错误的出现是...

    java.net.SocketException Connection reset 解决方法

    "java.net.SocketException Connection reset 解决方法" 在 Java 编程中,SocketException 是一种常见的异常,特别是在网络编程中。Conexion reset by peer 是一种特殊的 SocketException,它发生在客户端和服务器...

    在Win7系统下抛出java.net.SocketException的解决办法

    ### 在Win7系统下抛出java.net.SocketException的解决办法 #### 问题背景及原因分析 在使用MyEclipse开发工具结合JBoss服务器进行项目开发的过程中,遇到一个常见但令人头疼的问题:当启动JBoss服务器时,控制台...

    java.net.SocketException: No route to host 异常原因

    NULL 博文链接:https://zhoudan241.iteye.com/blog/1432014

    java.net.SocketException: Connection reset 解决方法

    Java中的`java.net.SocketException: Connection reset`是一个常见的网络编程错误,通常表示在TCP/IP通信过程中,连接突然中断。这个异常可能在客户端或服务器端发生,通常与数据传输的异常中断有关。 首先,我们来...

    http接口调用报错.rar

    接口调用报错:java.net.SocketException: java.lang.ClassNotFoundException: Cannot find the specified class com.ibm.websphere.ssl.protocol.SSLSocketFactory

    Java Socket常见异常处理

    4. **java.net.SocketException: (Connection reset 或 Connect reset by peer: Socket write error)** 这两种异常都表示连接已断开。可能的原因是一端关闭了Socket,而另一端仍在尝试读写。处理这类异常需要检测到...

    Ice-3.7.4.msi for windows版

    at Ice.ConnectionI.initialize(ConnectionI.java:1536) at Ice.ConnectionI.socketReady(ConnectionI.java:1116) at Ice.ConnectionI$SocketReadyCallback.socketReady(ConnectionI.java:2299) at IceInternal....

    Linux下打开的文件过多错误

    Linux下运行tomcat或者was出现java.net.SocketException: 打开的文件过多错误 tomcat报“too many open files”的错误,解决办法如下:

    Google I/O 2013推荐Android 网络通信框架Volley

    Volley是Google在2013年的I/O大会上推出的一款高效的Android网络通信框架,它专为Android应用设计,旨在简化网络请求的处理,提高应用程序的响应速度和用户体验。这款框架的核心理念是快速、高效和易用,使得开发者...

    fastdfs使用java

    在Java中使用FastDFS,首先需要在项目中引入FastDFS的Java客户端库。配置client.conf文件,设置tracker服务器的地址和其他相关参数。接着创建FastdfsClient和FastdfsUtil类,前者用于与FastDFS服务器通信,后者封装...

    java网络编程示例

    import java.net.SocketException; public class UDPServer { public static void main(String[] args) { try { byte [] buffer = new byte[1024]; DatagramSocket socket = new DatagramSocket(4444); ...

    ip6-java.zip

    5. **NIO (Non-blocking I/O)**:Java的非阻塞I/O库,如`java.nio.channels`包下的类,可以用来创建支持IPv6的高性能服务器。 6. **URI和URL**:`java.net.URI`和`java.net.URL`类用于处理统一资源标识符和统一资源...

    JMeterPlugins-Standard.jar和JMeterPlugins-Extras.jar.rar

    《JMeter插件详解:Standard与Extras的魅力》 在性能测试领域,Apache JMeter是一款备受推崇的开源工具,它能够对各种服务器、网络或对象进行压力和负载测试。然而,尽管JMeter本身功能强大,但有时其内置的功能并...

    socket编程

    import java.net.SocketException; public class Server { public static void main(String[] args) { try { // 创建DatagramSocket对象,指定接收端口 DatagramSocket socket = new DatagramSocket(4567); ...

    Socket长连接异常处理

    java.net.ConnectException: Connection refused: connect 该异常发生在客户端进行 new Socket(ip, port) 操作时,原因是客户端无法连接到服务器端,可能是因为 ip 地址或端口号错误,或者是服务器端没有监听该端口...

    System.SR.dll 无法显示错误信息

    System.Net.WebException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集 ---> System.Net.Sockets.SocketException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集 ...

    Hive2Hive-master.rar

    在Java中,Socket类和ServerSocket类分别用于客户端和服务端的通信建立。 2. **Hive数据同步需求**: 在大数据环境中,数据的实时同步是非常关键的。例如,当一个Hive集群中的数据发生变化时,可能需要将这些变化...

    如何解决线程太多导致java socket连接池出现的问题

    3. 错误信息:当Socket连接池出现问题时,可能会出现错误信息,如"java.net.SocketException: No buffer space available (maximum connections reached?): listen failed"。 解决方法 要解决线程太多导致Socket...

    Java实现modbus tcp协议数据读写,项目内包含modbus slave仿真软件

    本项目专注于使用Java语言实现Modbus TCP/IP协议的读写功能,提供了两种不同的实现方案:jlibmodbus和modbus4j库。这两种库都是Java社区开发的开源工具,专门用于处理Modbus通信。 首先,我们来看jlibmodbus。...

Global site tag (gtag.js) - Google Analytics