【问题标题】:org.apache.http.NoHttpResponseException: XX.XX.XX.XX:443 failed to respondorg.apache.http.NoHttpResponseException: XX.XX.XX.XX:443 未能响应
【发布时间】:2014-09-30 01:20:03
【问题描述】:

目前我正在使用 Apache http 组件客户端 V4.3.5。在我的情况下,我可以上传小文件(1kb),但是当我运行代码并得到异常“org.apache.http.NoHttpResponseException:192.168.128.109:443 failed to respond时,它不适用于大文件(100kb) ”。谁能看看我的代码,让我知道是什么导致了我的问题?

这是我的代码:

public static void main(String[] args) throws IOException,
        KeyStoreException {
    try {
        SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(
                null, new TrustStrategy() {
                    public boolean isTrusted(X509Certificate[] chain,
                            String authType) throws CertificateException {
                        return true;
                    }
                }).build();

        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                sslContext,
                SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

        HttpClientBuilder builder = HttpClientBuilder.create();
        builder.disableContentCompression();
        builder.setSSLSocketFactory(sslsf);
        SocketConfig config = SocketConfig.custom().setSoKeepAlive(true).setSoTimeout(300000).build();
        builder.setDefaultSocketConfig(config);
        CloseableHttpClient httpclient = builder.build();

        HttpPost httppost = new HttpPost("https://192.168.128.109/upload");

        String encodedAuthorization = DatatypeConverter
                .printBase64Binary("admin:itronitr".getBytes());
        httppost.setHeader("Authorization", "Basic " + encodedAuthorization);

        FileBody bin = new FileBody(new File("c:\\test.txt"));
        String boundary = "hK1oPL5_XSfbm6lkCNlKI63rltrew5Bqik0ul";

        HttpEntity reqEntity = MultipartEntityBuilder.create()
                .setBoundary(boundary).addPart("upfile", bin).build();

        httppost.setEntity(reqEntity);

        System.out.println(httppost.getEntity().getContentLength());
        System.out
                .println(httppost.getEntity().getContentType().toString());

        CloseableHttpResponse response = httpclient.execute(httppost);
        HttpEntity resEntity = response.getEntity();
        System.out.println(response.getStatusLine());

        String content = EntityUtils.toString(resEntity);
        System.out.println(content);

    } catch (Exception exc) {
        exc.printStackTrace();
    }

}

谢谢, 比尔

【问题讨论】:

  • 我们使用 python 将相同的文件上传到服务器并且它正在工作。这个问题只发生在 Java 中。我的 JDK 是 java 版本“1.7.0_67”。
  • 我通过覆盖 HTTP 客户端中的 HttpRequestRetryHandler 来修复它。 stackoverflow.com/questions/10570672/…

标签: httpclient


【解决方案1】:

最后我解决了这个问题,它是由缓冲区大小引起的。默认情况下,httpclient 的缓冲区大小为 8k。所以我把它改成 4k 并且我的代码运行良好。

这里是改变缓冲区大小的代码:

 ConnectionConfig connectionConfig = ConnectionConfig.custom()
                .setBufferSize(4128)
                .build();

 CloseableHttpClient httpclient = HttpClients.custom()
                .setDefaultConnectionConfig(connectionConfig)
                .build();

【讨论】:

  • 你是如何到达 4k 的?
  • 不适合我。似乎这不是根本原因。我得到“org.apache.http.NoHttpResponseException: myserver:443 failed to respond”,我发现目标服务器根本没有收到请求。
  • 这不是根本原因,这对我不起作用。
【解决方案2】:

这对我有用;可能适合你,也可能不适合你!!

我最近遇到了同样的问题,并尝试了我在互联网上能找到的所有建议,即将httpClient 升级到最新版本并添加重试处理程序;但没有人为我修好。

我已经在我的代码中构建了一个重试处理程序,并且在最新的 Apache 客户端上运行,但它仍然失败,出现异常 Caused by: org.apache.http.NoHttpResponseException: xxxxx:443 failed to respond 所以,我花了将近 2 天的时间来调试这个问题并找到根本原因(至少在我的情况下)

在 Java 11.0.3 之前的旧 Java 版本中似乎存在一个错误,该错误会阻止 Apache HTTP 客户端发送由https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8214339 引起的大于 16368 字节的有效负载。

我在 java 11.0.2 上运行,当我升级到 11.0.10 时,它对我有用,我能够发送更大的有效负载而无需更改任何代码

【讨论】:

    【解决方案3】:

    我也遇到了类似的问题。我浏览了许多博客和论坛并尝试了各种方法,但没有一个对我有用。所以,我尝试了一种解决方法。我添加了如下重试处理程序。它对我有用:

    HttpClientBuilder.create()
                .setDefaultCredentialsProvider(provider)
                .setRetryHandler(new DefaultHttpRequestRetryHandler() {
                    @Override
                    public boolean retryRequest(final IOException exception, final int executionCount, final HttpContext context) {
                        if (exception instanceof NoHttpResponseException) {
                            return true;
                        }
                        return super.retryRequest(exception, executionCount, context);
                    }
                })
                .build();
    

    虽然这不是一个正确的修复程序,只是一种解决方法,但它现在对我有用。我会坚持这个解决方案,直到我不会得到任何永久的解决方案。在这里分享,以防有人从中受益。

    【讨论】:

      猜你喜欢
      • 2020-03-14
      • 2022-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      相关资源
      最近更新 更多