2009-12-17 209 views
7

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

的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(); 

但为什么运作?

已更新一次!
错误是固定的!:)

我们与连接不在一个班级,但在两个。
并且在第二类下面一行:

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

注: setRequestProperty("Content-Length", "1000")是问题的根源。

+0

为什么openConnection被调用两次? – 2009-12-17 10:25:36

+0

这只是误印。 更正。 – 2009-12-17 10:32:30

回答

8

'我们有一个类似的问题,这是由旧Java中的错误保持运行造成的。之前加入这个连接,看是否有帮助,

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

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

没有帮助:( – 2009-12-17 13:11:29

+0

第二种方法怎么样?你真的需要发布一个TCP转储来查看问题究竟是什么。我不认为它是DNS,因为这发生在connect()调用中。 – 2009-12-17 13:33:44

+0

在我看来,keepAlive = false有帮助。但为什么? – 2009-12-17 14:10:50

2

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

+0

我们在不同的计算机上和不同的国家:( – 2009-12-17 10:33:32

+0

)有这样的问题你用Wireshark看过吗? – 2009-12-17 12:09:02

1

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

setReadTimeOut()低值和while循环呢?

+0

我们使用java 1.4 – 2009-12-17 10:23:24

1

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

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

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

+0

我们在不同的计算机上和不同的国家使用这个问题:( – 2009-12-17 10:34:02

+0

在同一家公司?请问您的私人网络中的DNS是否相同? – enguerran 2009-12-17 11:20:25

+0

否 - 不同的公司,不同的DNS,不同的网络。 – 2009-12-17 11:22:45

4

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

您可以从代码中使用禁用它:g-Djava.net.preferIPv4Stack=true

1

我同样的问题,所以我到了HTTPClient Apache的变化,遵循一个例子:

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

您也可以通过命令行使用禁用:

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");