繁体   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