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

我们有下一个代码。
有时我们应该在最后一行等待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中的bug-alive引起的。 在连接之前添加它以查看它是否有帮助,

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

要么

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

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

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

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

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

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

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

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

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

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

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

我有同样的问题,所以我从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");