有时HttpURLConnection.getInputStream的执行速度太慢

问题描述 投票:9回答:6

我们有下一个代码。 有时我们应该在最后一行等待10-20-40秒。 可能是什么问题?

Java 1.4

URL url = ...;
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.connect();
OutputStream out = conn.getOutputStream();
ObjectOutputStream outStream = new ObjectOutputStream(out);
try
{
   outStream.writeObject(objArray);
}
finally
{
   outStream.close();
}

InputStream input = conn.getInputStream();

更新: 下一个代码修复了问题IN ECLIPSE。 但它仍然无法通过Java WebStart工作:(

HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
conn.setDoInput(true);  
conn.setDoOutput(true);  
conn.setUseCaches(false);  
System.setProperty("http.keepAlive", "false");  //<---------------
conn.connect();  

但为什么?

再次更新一次! Bug被修复了! :) 我们使用的连接不是一个类,而是两个。 第二类有以下几行:

URL url = ...  
HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
conn.setRequestProperty("Content-Length", "1000");  //<------------
conn.connect();  

注意:setRequestProperty("Content-Length", "1000")是问题的根本原因。

java http tomcat servlets
6个回答
10
投票

'我们遇到了一个类似的问题,这个问题是由旧Java中的bug-alive引起的。在连接之前添加它以查看它是否有帮助,

conn.setRequestProperty("Connection", "close");

要么

System.setProperty("http.keepAlive", "false");

4
投票

有同样的问题,发现它是由IPv6引起的。

您可以使用以下代码禁用它:

System.setProperty("java.net.preferIPv4Stack" , "true");

您也可以使用以下命令行禁用它:g-Djava.net.preferIPv4Stack=true


2
投票

尝试使用IP地址。看看它是否是DNS问题。


2
投票

我有同样的问题,所以我从Apache改为HTTPClient,举个例子:

HttpClient httpClient = HttpClientBuilder.create().build();

HttpPost request = new HttpPost("www.myurl-to-read");

RequestConfig requestConfig = RequestConfig.custom()
                              .setSocketTimeout(8000)
                              .setConnectTimeout(10000)
                              .setConnectionRequestTimeout(1000)
                              .build();

request.setConfig(requestConfig);

request.setHeader("Content-type", "application/json");

HttpResponse  response = httpClient.execute(request);

HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, "UTF-8");

1
投票

问题可能来自网络子层...应该很难找到它。

但是具有低价值和while循环的setReadTimeOut()怎么样?


1
投票

有一件事我猜是你的DNS服务器没有很好的响应。

您可以尝试在开始之前将符号域名更改为数字IP地址吗?或者你可以做两次请求(仅用于实验)并查看第一个请求是否明显慢于第二个请求?

谷歌已经(以及其他)8.8.8.8建立了DNS服务器。他们声称它比大多数其他DNS服务器更快。试一试!

© www.soinside.com 2019 - 2024. All rights reserved.