java.net.Socket.setSoTimeout可靠吗?

时间:2009-11-09 22:41:12

标签: java sockets tcp timeout

来自setSoTimeout

的JavaDoc
  

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

从互联网上的各种帖子中我都看到SO_TIMEOUT在使用Socket C API时非常不可靠(例如here)。

因此,问题是,使用setSoTimeout检查失控会话是否可靠?

如果没有,您建议使用哪些技术对套接字会话设置时间限制?

4 个答案:

答案 0 :(得分:3)

我不知道任何相关的最新/当前操作系统,其中(流)套接字超时不能正常工作。您链接的帖子来自一个相当混乱的海报,它试图在数据报套接字上设置发送超时,这完全没有意义。数据报要么立即发送,要么以静默方式丢弃。

答案 1 :(得分:2)

我不知道任何现代平台操作系统平台,其网络堆栈如此破碎,以至于套接字超时不起作用。但如果有人知道现实生活中的例子,请将其添加为评论!

我不担心这种情况,除非你真的被迫在如此破碎的操作系统上支持你的应用程序。我怀疑这将是一次痛苦的锻炼。

答案 2 :(得分:1)

该链接与SO_RCVTIMEO有关。问题是关于Socket.setSoTimeout()。在唯一的平台中,我知道前者不起作用的地方(某些版本的Solaris),后者使用select()进行捏造,这确实有效。该方法的合同要求它。你不需要担心这个问题,除非有人真正提出了一个我从未在16年内见过的平台。

答案 3 :(得分:0)

查看Java 6 nio中的连接类,它们现在包括套接字并执行非阻塞操作,因此您可以根据需要取消操作。

Apache htmlclient核心(?)现在能够使用nio套接字,所以看起来他们有了这个概念。不过,这就是我所知道的。