【问题标题】:Apache HTTPClient Timeout at any momentApache HTTPClient 随时超时
【发布时间】:2016-12-23 06:48:18
【问题描述】:

我正在使用 Apache Common 的 HTTPClient 建立 HTTP 连接。 连接类型是 POST,客户端将从连接中读取输出。 但是,无论连接状态如何,我都需要能够随时中止连接。这样做的最佳方法是什么? 是否有内置超时? 问候。

编辑: 只是为了澄清我的问题:
我希望用户能够选择何时断开连接。
换句话说,类似于参数 cURL 的功能: CURLOPT_TIMEOUT https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html

【问题讨论】:

    标签: java http apache-commons


    【解决方案1】:

    当您使用HttpClientBuilder 实例化httpClient 的实例时,您可以将RequestConfig 的实例传递给构建器,该构建器又接受2 个参数。

    SocketTimeout - 以毫秒为单位定义套接字超时 (SO_TIMEOUT),即等待数据的超时时间,或者换句话说,两个连续数据包之间的最长不活动时间。

    ConnectTimeout - 确定建立连接之前的超时时间(以毫秒为单位)。超时值为零被解释为无限超时。

    ConnectionRequestTimeout - 返回从连接管理器请求连接时使用的超时时间(以毫秒为单位)。超时值为零被解释为无限超时。

    您正在寻找的是 SocketTimeout

    RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(CONNECTION_TIMEOUT)
                    .setConnectionRequestTimeout(CONNECTION_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).build();
    httpClient = HttpClientBuilder.create().disableAutomaticRetries().setDefaultRequestConfig(requestConfig)
                    .setConnectionManager(poolingHttpClientConnectionManager).disableRedirectHandling().build();
    

    你可以看看ConnectionKeepAliveStrategy。参考page的“2.6.连接保活策略”部分

    【讨论】:

    • 您好,感谢您的回复。对不起,我没有让自己足够清楚,我想。我已经尝试过使用套接字超时的解决方案,但它不会停止连接。基本上,我将通过该连接接收恒定的数据流,但我希望能够在用户指定的时间(例如 10 秒)后切断它。
    • @GreenApples53 好的,我误解了这个问题。你能看看 ConnectionKeepAliveStratergy 是否有帮助吗?从服务器收到第一个响应后,您可以使用 keep-alive 超时来处理此问题。在收到响应之前,您可以利用套接字超时来实现这一点。所以我想你需要将它们混合在一起
    • 我目前实现了一个解决方案,它产生一个计时器线程,在指定时间后简单地中止连接。我不确定这是否是最佳做法,但它似乎对我有用。你认为这样做会有什么问题吗?亲切的问候
    【解决方案2】:

    如果您使用的是DefaultHttpClient,它接受HttpParams,您可以在其中提供与连接相关的设置。

    SO_TIMEOUT 是 SocketTimeout - 以毫秒为单位定义套接字超时 (SO_TIMEOUT),这是等待数据的超时时间,或者换句话说,是两个连续数据包之间的最长不活动时间。

    HttpParams httpParams = new BasicHttpParams();
    httpParams.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, CONNECTION_TIMEOUT);
    httpParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, SOCKET_TIMEOUT);
    DefaultHttpClient backend = new DefaultHttpClient(httpParams);
    

    按照@Bandi Kishore 的建议,更好的方法是使用 HttpClientBuilder。或使用PoolingClientConnectionManager 直接使用setter 接受这些设置。

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 2011-08-26
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多