【发布时间】:2023-03-17 19:26:01
【问题描述】:
假设我有多个套接字连接,每个套接字连接都可能希望在无限超时和有限超时之间单独切换,以进行 I/O 操作。 Socket.setSoTimeout() 的文档暗示对任何 Socket 调用 setSoTimeout() 将更改所有 Socket 对象的超时,因为字段 SocketOptions.SO_TIMEOUT 是静态的。
有没有办法为单个 Socket 对象设置超时?
【问题讨论】:
假设我有多个套接字连接,每个套接字连接都可能希望在无限超时和有限超时之间单独切换,以进行 I/O 操作。 Socket.setSoTimeout() 的文档暗示对任何 Socket 调用 setSoTimeout() 将更改所有 Socket 对象的超时,因为字段 SocketOptions.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。 java 文档的摘录
Socket#setSoTimeout
使用指定的超时启用/禁用 SO_TIMEOUT,以毫秒为单位。 将此选项设置为非零超时,read() 调用 与 this Socket 关联的 InputStream 将只阻塞这个 多少时间。如果超时到期,则 引发了 java.net.SocketTimeoutException,尽管 Socket 仍然存在 有效的。必须在进入阻止之前启用该选项 操作才能生效。超时必须 > 0。超时为零 被解释为无限超时。
【讨论】: