簡體   English   中英

在套接字讀取時獲取操作超時異常

[英]Getting operation timed out exception on socket read

如果我設置mSocket.setSoTimeout(1000); 我明白了

java.net.SocketTimeoutException:讀取超時

mSocket.getInputStream().read()等待一秒鍾之后mSocket.getInputStream().read()預期的mSocket.getInputStream().read()

但是,如果我做mSocket.setSoTimeout(0); 我明白了

java.net.SocketException:操作超時

大約一分鍾后(大部分時間都是55秒)等待令人費解。

我嘗試在我的Mac OS El Capitan上增加sysctl tcp設置無濟於事。 如果這些設置被限制為大約一分鍾的超時,我應該得到與以前相同的讀取超時異常。 什么是這個操作超時異常?

編輯:可能值得一提的是,我故意使用pfctl將網絡關閉,因為我在tcp上使用websockets,我希望連接不會因為超時而中斷,並且一旦我再次啟動網絡,流程就會繼續。

兩個異常的堆棧跟蹤是相同的,即

at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at java.net.SocketInputStream.read(SocketInputStream.java:203)
at org.jwebsocket.kit.WebSocketProtocolAbstraction.protocolToRawPacket(WebSocketProtocolAbstraction.java:220)

當應用程序調用setSoTimeout(0) OS實際上可能會永遠等待數據。 但是,無論SO_TIMEOUT值如何,都有幾種事件會中斷讀操作。

如果操作系統破壞了套接字后面的TCP連接,那么讀取操作就會中斷,因為TCP連接不再存在,並且將來沒有機會接收任何數據。 即使對等體稍后發送數據,本地TCP棧也會丟棄它(並且可能回答TCP-RST)。

操作系統破壞了TCP連接,因為它發送數據並且沒有收到任何ACK。 所以操作系統嘗試重新傳輸數據,然后它放棄了並且破壞了連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM