setSoTimeout 的功能是什么,它是如何工作的?

2022-08-31 16:39:00

我试图自己学习Socket。我对以下来自Oracle网站的文本感到有些困惑。我对此有一些疑问。提前感谢您的任何清晰解释。

setSoTimeout

public void setSoTimeout(int timeout) throw SocketException

启用/禁用具有指定超时的SO_TIMEOUT,以毫秒为单位。将此选项设置为非零超时,对此 Socket 关联的 调用将仅阻止此时间量。如果超时过期,则会引发 a,但套接字仍然有效。在进入阻止操作之前,必须启用该选项才能生效。超时必须> 0。超时为零被解释为无限超时。read()InputStreamjava.net.SocketTimeoutException

  1. 什么?SO_TIMEOUT

  2. 套接字是连接的终结点。如果我说

    mySocket.setSoTimeout(2000);
    

    这是否意味着我阻止从服务器/客户端读取此套接字的任何输入 2000 毫秒,并且在此时间之后套接字已准备好读取数据?

  3. 时过期是什么意思?

  4. 在阻止操作之前必须启用的选项是什么?

  5. 无限超时意味着套接字不再读取?


答案 1

这是否意味着我阻止从服务器/客户端读取此套接字的任何输入 2000 毫秒,并且在此时间之后套接字已准备好读取数据?

不,这意味着如果在2000ms内没有数据到达,将抛出一个。SocketTimeoutException

时过期是什么意思?

这意味着2000ms(在你的情况下)没有任何数据到达。

在阻止操作之前必须启用的选项是什么?

没有一个“必须”启用。如果您的意思是“可能已启用”,这是其中之一。

无限超时意味着套接字不再读取?

多么奇怪的建议。这意味着,如果没有数据到达,您将永远阻止读取。


答案 2

JavaDoc很好地解释了这一点:

将此选项设置为非零超时,与此套接字关联的 InputStream 上的 read() 调用将仅阻塞此时间量。如果超时过期,则会引发 java.net.SocketTimeoutException,尽管该 Socket 仍然有效。在进入阻止操作之前,必须启用该选项才能生效。超时必须> 0。超时为零被解释为无限超时。

SO_TIMEOUT是调用将阻止的超时。如果达到超时,将抛出 java.net.SocketTimeoutException。如果要永久阻止将此选项设置为零(默认值),则调用将阻止,直到至少可以读取 1 个字节。read()read()


推荐