2017-04-03 62 views
0

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

In)的情况下,当我打电话

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

}catch (InterruptedIOException e) { 

} 

调用setSoTimeout(时,不是暂停sokcet后4000毫秒恢复?或者它只会完全阻塞来自套接字的所有读取,并且如果有任何尝试从setSoTimeout仍然活动的时候读取它,它会抛出异常?

如果最新,为什么这是有用的呢?在超时过期之后通过文档自动引发异常。

感谢您的澄清。

+0

你有一个奇怪的'超时'的概念。 – EJP

回答

1

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

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

这就是说,在套接字上的读取将被阻止超过指定的时间(当根据“超时”的含义解释时可能更清楚,并且当然更清楚如果您熟悉系统级套接字接口)。它确实而不是表示保证读取会阻塞这么长时间,这确实会是有用的。

通过设置超时值解决的问题之一是处理客户端在不关闭连接的情况下不干净地断开连接。本地机器无法检测到发生了这种情况,因此如果没有超时,尝试从连接到此类客户机的套接字读取将无限期地阻塞。

-1

我想,setSotimeout表示服务器可以等待响应read.if超时值的时间量,异常将被抛出。

为example.If设置setSotimeout(4000)到插座,

插座将等待只有4秒的接收到回应,后4秒抛出异常。

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

+0

它与服务器没有任何关系。它关于发送者和接收者。 – EJP