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

时间:2009-12-17 09:54:51

标签: java http tomcat servlets

我们有下一个代码 有时我们应该在最后一行等待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();

更新:
下一个代码修复了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")是问题的根本原因。

6 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:4)

遇到同样的问题,发现它是由IPv6造成的。

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分: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");

答案 4 :(得分:1)

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

但是setReadTimeOut()具有低值和while循环呢?

答案 5 :(得分:1)

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

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

Google已经在(其中包括)8.8.8.8中建立了DNS服务器。他们声称它比大多数其他DNS服务器更快。试一试!