我们有下一个代码。 有时我们应该在最后一行等待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问题。
我有同样的问题,所以我从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");
问题可能来自网络子层...应该很难找到它。
但是具有低价值和while循环的setReadTimeOut()
怎么样?
有一件事我猜是你的DNS服务器没有很好的响应。
您可以尝试在开始之前将符号域名更改为数字IP地址吗?或者你可以做两次请求(仅用于实验)并查看第一个请求是否明显慢于第二个请求?
谷歌已经(以及其他)8.8.8.8建立了DNS服务器。他们声称它比大多数其他DNS服务器更快。试一试!