[英]Java, Getting a weird Socket Exception: “Broken pipe” and “Operation timed out”
[英]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.