java - 套接字和 setSoTimeout()

标签 java sockets tcp tcpserver

我对 socket.setSoTimeout( int ) 方法很困惑。

在我打电话的情况下

 socket.setSoTimeout(4000);
 try{
      string data = input.read();

 }catch (InterruptedIOException e) {

}

当调用 setSoTimeout() 时,它是否会暂停 sokcet 并在 4000 毫秒后恢复?或者它会完全阻止从套接字读取所有内容,并且如果在 setSoTimeout 仍处于 Activity 状态时尝试从套接字读取任何内容,则会抛出异常?

如果是最新的,为什么这有用?根据文档,超时后会自动抛出异常。

感谢您的澄清。

最佳答案

Socket.setSoTimeout() 文档的关键部分是:

Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds. With this option set to a non-zero timeout, a read() call on the InputStream associated with this Socket will block for only this amount of time.

这意味着套接字上的读取将被阻止阻塞超过指定时间(根据“超时”的含义进行解释时可能会更清楚,如果您熟悉的话肯定会更清楚与系统级套接字接口(interface))。它并没有说保证读取会阻塞那么长时间,这确实是有问题的实用性。

通过设置超时解决的问题之一是处理不完全断开连接而不关闭连接的客户端。本地计算机无法检测到这种情况已经发生,因此如果没有超时,尝试从连接到此类客户端的套接字读取数据将无限期地阻塞。

关于java - 套接字和 setSoTimeout(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60410875/

相关文章:

c++ - Linux套接字编程: read data by SIGIO

tcp - 服务器发送了 FIN 但在客户端保持事件状态后未接受任何数据,导致 503 错误

c# - TCP 连接停留在 CLOSE_WAIT 状态

java - 使用unix通过crontab运行java类时出现ClassnotFoundException?

java - 为 Jpanel 制作图形,但属于不同的类

java - java中如何处理BufferedReader.readLine()转空而不返回任何值或异常?

java - 从 Android 应用程序向本地服务器多播消息

java - 如何正确扩展Java FilterOutputStream类?

java - 如何使用 java 将数字点 (.) 替换为逗号 (,)

C#如何用客户端向服务器发送更多消息?