2009-12-17 216 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");