设置单独的SO_TIMEOUT

时间:2016-05-15 15:47:06

标签: java sockets io

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

有没有办法为单个Socket个对象设置超时?

2 个答案:

答案 0 :(得分:1)

不,这并不意味着它会为所有套接字更改timeout。它只会更改关联套接字对象的timeout。摘自java文档 Socket#setSoTimeout

  

使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。   将此选项设置为非零超时,对()调用read()   与此Socket 关联的InputStream将仅阻止此操作   多少时间。如果超时到期,a   引发了java.net.SocketTimeoutException,尽管Socket仍然存在   有效。必须在进入阻止之前启用该选项   操作有效。超时必须> 0.超时为零   被解释为无限超时。

答案 1 :(得分:0)

在对`https://plnkr.co/edit/OtfLPuQFptfgUxuo0pXJ` 的源代码进行一些挖掘之后,似乎java.net.Socket不是全局超时值。相反,它是某个选项的某种ID,并且使用所述ID通过SocketOptions.SO_TIMEOUT实例检索实际的超时值。

SocketImpl