2010-04-14 116 views
7

我有一個DataInputStream,我從Socket獲得。有沒有什麼辦法可以設置dis.read(...)的超時時間?目前我產生了一個新線程來完成讀取。父線程在中斷之前執行thread.join(timeout)等待。我知道nio,但我不認爲我想在這一點上重構那麼多。謝謝。我可以爲InputStream的read()函數設置超時嗎?

回答

14

通常不在InputStream上,但可以使用Socket#setSoTimeout(int)爲套接字本身上的所有讀取操作設置超時。

+1

啊謝謝,我錯過了那一個。我唯一的後續問題是這樣的:這個時間似乎是每次讀取()被調用的次數,可能是多次。有沒有一種方法可以設置整個超時時間,如果每個read()的總和超過超時值,它會超時? – Zombies 2010-04-14 15:27:53

+0

不是自動的,但您可以設置一個比實際超時更短的S0超時,並且如果超過了允許的總運行時間,則檢查循環。 – jarnbjo 2010-04-14 16:58:00

+4

小心使用套接字超時和DataInputStream(以及一個BufferredInputStream)。這些會緩衝或讀取一些數據到臨時內存(如getLong()),然後如果發生超時(等待來自套接字的更多數據),您將丟失任何先前讀取的數據,並*無法恢復* 。 SocketTimeoutException擴展了InterruptedIOException,它提供了在超時之前成功傳輸的字節數。使用原始套接字,您可以使用它重試/繼續(也許可以刷新錯誤消息)。 – 2010-04-15 03:32:38

相關問題