gpt4 book ai didi

java - 获取套接字读取操作超时异常

转载 作者:可可西里 更新时间:2023-11-01 02:53:55 26 4
gpt4 key购买 nike

如果我设置 mSocket.setSoTimeout(1000); 我得到

java.net.SocketTimeoutException: Read timed out

在预期的 mSocket.getInputStream().read() 上等待一秒钟后。

但是,如果我执行 mSocket.setSoTimeout(0); 我会得到

java.net.SocketException: Operation timed out

等待大约一分钟(在我的大部分运行中为 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) 时,操作系统实际上可能会永远等待数据。但是有几种事件会中断读取操作,而不管 SO_TIMEOUT 值如何。

如果操作系统破坏套接字后面的 TCP 连接,那么读取操作将被中断,因为 TCP 连接不再存在并且将来没有机会接收任何数据。即使对等方稍后发送数据,本地 TCP 堆栈也会丢弃它(并可能回答 TCP-RST)。

OS 破坏了 TCP 连接,因为它发送了数据但没有收到任何 ACK。所以操作系统试图重新传输数据,但它在一段时间后放弃并破坏了连接。

关于java - 获取套接字读取操作超时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40441420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com