假设我有多个套接字连接,其中的每个套接字连接都可能要针对I/O操作分别在无限超时和有限超时之间切换。 Socket.setSoTimeout()
的文档意味着在任何Socket
上调用setSoTimeout()
都会更改所有Socket
对象的超时,因为字段SocketOptions.SO_TIMEOUT
是静态的。单独设置SO_TIMEOUT
是否有任何方法来设置单个Socket
对象的超时?
假设我有多个套接字连接,其中的每个套接字连接都可能要针对I/O操作分别在无限超时和有限超时之间切换。 Socket.setSoTimeout()
的文档意味着在任何Socket
上调用setSoTimeout()
都会更改所有Socket
对象的超时,因为字段SocketOptions.SO_TIMEOUT
是静态的。单独设置SO_TIMEOUT
是否有任何方法来设置单个Socket
对象的超时?
在对java.net.Socket
的源代码进行了一些挖掘之后,似乎SocketOptions.SO_TIMEOUT
不是全局超时值。相反,它是某种选项的某种ID,并且使用所述ID通过SocketImpl
实例检索实际的超时值。
public synchronized int getSoTimeout() throws SocketException {
if (isClosed())
throw new SocketException("Socket is closed");
Object o = getImpl().getOption(SocketOptions.SO_TIMEOUT);
/* extra type safety */
if (o instanceof Integer) {
return ((Integer) o).intValue();
} else {
return 0;
}
}
不,这并不意味着它将改变所有套接字的timeout
。它只会更改关联套接字对象的timeout
。从 Socket#setSoTimeout
Java文档节录启用与指定的超时/禁用SO_TIMEOUT,以毫秒为单位。 将此选项设置为非零超时时,与关联的 InputStream上的read()调用此套接字将仅阻塞此 时间量。如果超时到期,将引发一个 java.net.SocketTimeoutException异常,但Socket仍然是 有效。该选项必须在进入阻止 操作之前启用才能生效。超时时间必须> 0。零时间 被解释为无限超时。