2012-05-08 35 views
0

可能重複:
Receiving request timeout even though connect timeout and read timeout is set to default (infinite)?當ConnectTimeout和ReadTimeout無限時,SocketTimeoutException?

我試圖連接到一個Web服務,約20秒後收到了SocketTimeoutException。託管Web服務的Tomcat服務器已關閉,因此預計需要Exception。但是,我沒有設置ConnectTimeout和ReadTimeout的值。根據文件,這兩個的默認值是無限的。此

一種可能性是,我試圖連接到服務器都有其自己的超時。但是當我的朋友嘗試使用iOS連接它時,約1分15秒後他的連接超時。如果服務器是發出超時的服務器,則我們的連接應該幾乎同時超時。請注意,他也正在使用iOS的默認時間。

  • 爲什麼我的套接字在連接和讀取超時設置爲無限時很早超時?
  • 套接字超時是否與連接和讀取超時不同?如果是這樣,它有什麼不同?
  • 我怎樣才能知道我的套接字超時值?我正在使用HttpURLConnection。
  • 有沒有辦法設置套接字超時?怎麼樣?

下面是我的代碼片段:

httpURLConnection = (HttpURLConnection) ((new URL("http://www.website.com/webservice")).openConnection()); 
httpURLConnection.setDoInput(isDoInput); 
httpURLConnection.setDoOutput(isDoOutput); 
httpURLConnection.setRequestMethod(method); 

try 
{ 
    OutputStreamWriter writer = new OutputStreamWriter(httpURLConnection.getOutputStream()); 
    writer.write("param1=value1"); 
    writer.flush; 
}catch(Exception e) 
{ 

} 
+0

轉播的:http://stackoverflow.com/questions/9986712/receiving-request-timeout-even-though-connect-timeout-and-read-timeout-is-set-to – Krrose27

+0

你爲什麼要重新問你已經有了一個問題的答案? – EJP

+0

@ Krroae27:謝謝你提到它。我很抱歉。我暫時停止解決這個問題,以完成不同的任務。我忘了我之前已經發布過類似的問題。 – Arci

回答

3

爲什麼我的插座超時這麼早,當我連接和讀取超時設置爲無窮大?

代碼請。

是套接字超時不同的連接和讀取超時?如果是這樣,它有什麼不同?

SocketTimeoutException是讀取超時。

我怎樣才能知道我的套接字超時值?我正在使用HttpURLConnection。

HttpURLConnection.getReadTimeout();也HttpURLConnection.getConnectTimeout()

有沒有一種方法來設置套接字超時?怎麼樣?

HttpURLConnection.setReadTimeout().

您已經引用在original post所有這些方法。你爲什麼在這裏問他們?

+0

謝謝!我已經更新了我的問題以包含我的代碼片段。正如我之前所說的,我忘了我原來的帖子。我試圖刪除這篇文章,但我不能已經因爲已經有了答案。無論如何,我的readTimeout使用的是無限的默認值。我還使用getReadTimeout對其進行了檢查,值爲0. – Arci

0

最後,我發現了什麼導致我的超時!事實證明,這確實是導致我超時的服務器。起初,我懷疑這個問題,因爲我在使用超過1分鐘的iOS時收到了不同的超時時間。

所以這裏是: 持有我的Tomcat服務器的操作系統是Windows。對於未應答連接,Windows的默認重試次數爲2.因此,當您第一次嘗試連接失敗時,仍然有2次重試。重試全部在內部完成。我不確定每次重試的時間是如何計算的,但基本上它是3 + 6 + 12 = 21秒。

  • 第一重試=3秒
  • 第二重試=6秒
  • 第三重試=12秒

在第三重試後,您的連接將被切斷。而且,到那個時候,你已經等了21秒。

+0

(1)Windows不會導致此問題。您描述了連接時的Windows行爲。你的問題是關於連接時Android的行爲。 (2)如果您在嘗試連接時遇到'SocketTimeoutException',那是'Android'平臺中的一個錯誤。它應該拋出一個'ConnectException',並且'連接超時'消息。 'SocketTimeoutException'只用於讀取和接受,就像它在Javadoc中所說的那樣。 – EJP