socket和setSoTimeout()

时间:2017-04-03 19:56:50

标签: java sockets tcp tcpserver

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

在我打电话的情况下

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

 }catch (InterruptedIOException e) {

}

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

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

感谢您的澄清。

2 个答案:

答案 0 :(得分:1)

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

  

使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。如果将此选项设置为非零超时,则与此Socket关联的InputStream上的read()调用将仅阻止这段时间。

这就是说套接字上的读取将被阻止超过指定时间的阻塞(根据“超时”的含义解释时可能更清楚,如果你熟悉的话,肯定会更清楚使用系统级套接字接口)。它表示读取保证会长时间阻塞,这确实会带来一些问题。

通过设置超时解决的问题包括在不关闭连接的情况下处理未清除的客户端。本地计算机无法检测到发生的情况,因此没有超时,尝试从连接到此类客户端的套接字读取将无限期地阻塞。

答案 1 :(得分:-1)

我认为,setSotimeout表示服务器等待读取响应的时间。如果超时值超出,则抛出异常。

例如。如果将setSotimeout(4000)设置为socket,

Socket只会等待4秒钟让接收器响应,它会在4秒后抛出异常。

它在慢速连接网络或坏服务器中很有用。 它避免了等待回应。