目前我正在使用Apache http组件客户端V4.3.5。在我的情况下,我可以上传小文件(1kb),但是当我运行代码并获得异常时它不能处理大文件(100kb)" org.apache.http.NoHttpResponseException:192.168.128.109:443没有回应#34;。任何人都可以查看我的代码,让我知道导致我的问题的原因是什么?
这是我的代码:
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();
}
}
谢谢, 比尔
答案 0 :(得分:2)
最后我修复了这个问题,它是由缓冲区大小引起的。默认情况下,httpclient的缓冲区大小为8k。所以我将它改为4k,我的代码运行良好。
以下是更改缓冲区大小的代码:
ConnectionConfig connectionConfig = ConnectionConfig.custom()
.setBufferSize(4128)
.build();
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultConnectionConfig(connectionConfig)
.build();
答案 1 :(得分:1)
我也遇到了类似的问题。我浏览了许多博客和论坛并尝试了各种方法,但没有一个对我有用。所以,我尝试了一种解决方法。我添加了重试处理程序,如下所示。它对我有用:
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();
虽然它不是一个正确的修复方法,只是一种解决方法,但它现在对我有用。我会坚持这个解决方案,直到我不会得到任何永久的解决方案。在这里分享,以防有人从中受益。
答案 2 :(得分:1)
这对我有用;可能适合也可能不适合你!!
我最近遇到了同样的问题,并尝试了所有我能在互联网上找到的建议,即将 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 时,它对我有用,我能够在不更改任何代码的情况下发送更大的有效负载