`
javathinker
  • 浏览: 232796 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

HttpClient 超时 用法

阅读更多

HttpClient在使用中有两个超时时间,是一直接触和使用的,由于上次工作中使用httpClient造成了系统悲剧的情况,特地对它的两个超时时间进行了小小的测试,在这里记录下。

测试版本为HttpClient——3.1

一:连接超时:connectionTimeout

1:指的是连接一个url的连接等待时间。

2:设置方法为:

public class TestHttpClientMain {

Java代码 复制代码
  1. /**
  2. *@paramargs
  3. */
  4. publicstaticvoidmain(String[]args){
  5. HttpClientclient=newHttpClient();
  6. HttpMethodmethod=newGetMethod(
  7. "http://test.com");
  8. client.getHttpConnectionManager().getParams()
  9. .setConnectionTimeout(3000);
  10. client.getHttpConnectionManager().getParams().setSoTimeout(3000);
  11. try{
  12. intstatusCode=client.executeMethod(method);
  13. System.out.println(statusCode);
  14. byte[]responseBody=null;
  15. responseBody=method.getResponseBody();
  16. Stringresult=newString(responseBody);
  17. System.out.println(result);
  18. }catch(HttpExceptione){
  19. //TODOAuto-generatedcatchblock
  20. e.printStackTrace();
  21. }catch(IOExceptione){
  22. //TODOAuto-generatedcatchblock
  23. e.printStackTrace();
  24. }
  25. }

3:测试的时候,将url改为一个不存在的url:“http://test.com”

4:超时时间3000ms过后,系统报出异常。

org.apache.commons.httpclient.ConnectTimeoutException: The host did not accept the connection within timeout of 3000 ms

Java代码 复制代码
  1. atorg.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:155)
  2. atorg.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:125)
  3. atorg.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
  4. atorg.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
  5. atorg.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
  6. atorg.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)

二:读取数据超时:soTimeout

1:指的是连接上一个url,获取response的返回等待时间

2:设置方法

public class TestHttpClientMain {

Java代码 复制代码
  1. /**
  2. *@paramargs
  3. */
  4. publicstaticvoidmain(String[]args){
  5. HttpClientclient=newHttpClient();
  6. HttpMethodmethod=newGetMethod(
  7. "http://localhost:8080/firstTest.htm?method=test");
  8. client.getHttpConnectionManager().getParams()
  9. .setConnectionTimeout(3000);
  10. client.getHttpConnectionManager().getParams().setSoTimeout(2000);
  11. try{
  12. intstatusCode=client.executeMethod(method);
  13. System.out.println(statusCode);
  14. byte[]responseBody=null;
  15. responseBody=method.getResponseBody();
  16. Stringresult=newString(responseBody);
  17. System.out.println(result);
  18. }catch(HttpExceptione){
  19. //TODOAuto-generatedcatchblock
  20. e.printStackTrace();
  21. }catch(IOExceptione){
  22. //TODOAuto-generatedcatchblock
  23. e.printStackTrace();
  24. }
  25. }

3:测试的时候的连接url为我本地开启的一个url,http://localhost:8080/firstTest.htm?method=test

在我这个测试url里,当访问到这个链接时,线程sleep一段时间,来模拟返回response超时。

@RequestMapping(params = "method=test") //<——②

Java代码 复制代码
  1. publicStringtestMethod(ModelMapmodel){
  2. try{
  3. Thread.sleep(3000);
  4. }catch(InterruptedExceptione){
  5. //TODOAuto-generatedcatchblock
  6. e.printStackTrace();
  7. }
  8. System.out.println("calltestMethodmethod.");
  9. model.addAttribute("name","testmethod");
  10. return"test";
  11. }

4:将读取response返回超时时间设的时间比那个sleep时间短之后,运行程序给出异常:

java.net.SocketTimeoutException: Read timed out

Java代码 复制代码
  1. atjava.net.SocketInputStream.socketRead0(NativeMethod)
  2. atjava.net.SocketInputStream.read(UnknownSource)
  3. atjava.io.BufferedInputStream.fill(UnknownSource)
  4. atjava.io.BufferedInputStream.read(UnknownSource)
  5. atorg.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78)
  6. atorg.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106)
  7. atorg.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1116)
  8. atorg.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1973)
  9. atorg.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1735)

ok,以后再写httpClient这两个超时时间一定要加上,不加就很可能悲剧的了。

分享到:
评论

相关推荐

    HttpClient用法

    在这个主题中,我们将深入探讨HttpClient的用法,特别是如何获取客户端信息并发送回服务器。 首先,让我们了解如何初始化HttpClient实例。HttpClient的使用通常始于创建一个HttpClient对象。你可以使用`HttpClients...

    java httpclient设置超时时间和代理的方法

    Java HTTPClient 设置超时时间和代理的方法 Java HTTPClient 是一个功能强大且灵活的 HTTP 客户端库,提供了许多实用的功能来处理 HTTP 请求。其中,设置超时时间和代理是两个非常重要的配置项,本文将详细介绍如何...

    HTTPClient用法

    这篇博客文章“HTTPClient用法”可能是关于如何使用Apache HttpClient库进行HTTP通信的教程,虽然具体内容没有给出,但我们可以根据常见的HTTPClient使用场景和方法来探讨相关知识点。 1. **Apache HttpClient简介*...

    httpclient简单使用

    本教程将基于标题"HTTPClient简单使用"和提供的文件`HttpService`、`HttpClient`来阐述HTTPClient的基本使用方法。 1. **HTTPClient简介** HTTPClient是Apache的 HttpClient库,它为Java开发者提供了全面的HTTP...

    dotnet 6 精细控制 HttpClient 网络请求超时.rar

    本教程将深入讲解如何在使用HttpClient时进行精细的超时控制,这对于处理长时间运行的请求或者优化应用性能至关重要。本文档主要面向C#开发者,但对Java开发者也有一定的参考价值,因为两者都属于面向对象编程语言,...

    httpClient组件使用说明

    本篇文章将详细讲解HttpClient的使用方法,包括如何搭建环境、所需的jar包、基本应用以及实例演示,旨在帮助初级学员快速掌握HttpClient的基础操作。 一、环境搭建 在使用HttpClient之前,首先需要在项目中引入...

    httpclient.jar包下载

    HttpClient库允许开发者执行各种HTTP方法(如GET、POST、PUT等),处理重定向、认证、cookie管理等复杂网络交互,同时提供了线程安全和高效的连接管理机制。这个库在处理Web服务API、爬虫程序或任何需要与HTTP服务器...

    HttpClientHelper 工具类

    HttpClientHelper 对这个类进行了封装,使得开发者无需直接与HttpClient接口打交道,而是通过更简洁、易用的方法调用来实现网络通信。这提高了代码的可读性和可维护性。 单例模式是软件设计模式的一种,确保一个类...

    使用HttpClient必须的jar包

    10. **配置和定制**:HttpClient具有高度可配置性,可以根据项目需求调整连接超时、读取超时、连接池大小等参数。 在实际使用中,开发者还需要根据项目的具体需求,考虑是否需要引入其他辅助库,如处理JSON的Gson或...

    HttpClient使用教程 事例

    首先,HttpClient库提供了一套完整的API,允许开发者构建复杂的HTTP请求,包括GET、POST、PUT等HTTP方法,同时支持连接管理、重试策略、超时设置等高级特性。在Java项目中,HttpClient通常被用来替代内置的`java.net...

    httpclient httpclient.jar

    在本文中,我们将深入探讨HttpClient的核心概念、使用方法以及如何通过`httpclient.jar`进行实战应用。 首先,HttpClient的主要组件包括: 1. **HttpClient实例**:这是整个HTTP通信的核心,负责管理连接、请求和...

    httpClient需要的jar包

    10. **性能优化**:通过配置连接超时、响应超时、线程池大小等参数,以及使用合适的连接管理策略,可以进一步优化HttpClient的性能。 在实际使用HttpClient时,需要根据项目需求选择合适的版本,理解其工作原理,...

    commons-httpclient,java中使用httpclient中使用的扩展工具

    在实际应用中,你需要根据项目需求配置HttpClient实例,例如选择合适的连接管理器、设置超时、添加身份验证等。同时,注意HttpClient库已经不再更新,对于新的Java项目,推荐使用现代化的HTTP客户端库,如Apache ...

    httpclient

    在本文中,我们将深入探讨HttpClient的主要特性和使用方法,以及如何利用它来处理HTTP协议的各种操作。 HttpClient支持多种HTTP方法,如GET、POST、PUT、DELETE等,可以方便地进行HTTP头的设置,发送cookies,处理...

    HttpClient4.5.1手册

    - **HttpClient 资源释放:** 为确保程序的健壮性,必须妥善管理HttpClient使用的各种资源,包括Socket连接等,以避免资源泄露的问题。 - **HTTP 执行上下文:** HTTP执行上下文是HttpClient中的一个重要概念,它...

    使用HttpClient调试android接口-通用方法

    在这个场景下,"使用HttpClient调试android接口-通用方法"的标题表明我们将讨论如何使用HttpClient来调试Android应用中的API接口。下面,我们将深入探讨HttpClient的基础知识、调试技巧以及如何封装通用方法。 1. *...

    HttpClient重新封装的HttpClient类

    首先,我们来看一下`HttpClient`类的基本用法。原生的`HttpClient`类提供了发送GET、POST等不同HTTP方法请求的能力。例如,发送GET请求可以这样实现: ```csharp using System.Net.Http; using System.Threading....

    commons-httpclient-3.0.jar JAVA中使用HttpClient可以用到

    1. **创建HttpClient实例**:首先,需要创建一个HttpClient实例,可以设置连接超时、重试策略等参数。 2. **选择HttpMethod**:根据实际需求选择合适的HttpMethod,比如使用GetMethod或PostMethod。 3. **设置请求...

Global site tag (gtag.js) - Google Analytics