2016-05-15 25 views
0

假设我有多个套接字连接,其中的每个套接字连接都可能要针对I/O操作分别在无限超时和有限超时之间切换。 Socket.setSoTimeout()的文档意味着在任何Socket上调用setSoTimeout()都会更改所有Socket对象的超时,因为字段SocketOptions.SO_TIMEOUT是静态的。单独设置SO_TIMEOUT

是否有任何方法来设置单个Socket对象的超时?

回答

0

在对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; 
    } 
} 
1

不,这并不意味着它将改变所有套接字的timeout。它只会更改关联套接字对象的timeout。从 Socket#setSoTimeout

Java文档节录启用与指定的超时/禁用SO_TIMEOUT,以毫秒为单位。 将此选项设置为非零超时时,与关联的 InputStream上的read()调用此套接字将仅阻塞此 时间量。如果超时到期,将引发一个 java.net.SocketTimeoutException异常,但Socket仍然是 有效。该选项必须在进入阻止 操作之前启用才能生效。超时时间必须> 0。零时间 被解释为无限超时。

相关问题