java.net.Socket.setSoTimeout可靠吗?

java.net.Socket.setSoTimeout可靠吗?,java,sockets,tcp,timeout,Java,Sockets,Tcp,Timeout,来自JavaDoc的 使用 指定的超时,以毫秒为单位。 将此选项设置为非零 超时,对 与此关联的InputStream 套接字将仅阻止此金额 时间的问题。如果超时过期,则 java.net.SocketTimeoutException为 已升起,但插座仍处于打开状态 有效的必须启用该选项 进入拦网前 行动要有效果。超时 必须大于0。超时值为零是错误的 解释为无限超时 从互联网上的各种帖子中,我读到当使用Socket C API(例如)时,SO_超时是相当不可靠的 因此,问题是,使用setSoTi

来自JavaDoc的

使用 指定的超时,以毫秒为单位。 将此选项设置为非零 超时,对 与此关联的InputStream 套接字将仅阻止此金额 时间的问题。如果超时过期,则 java.net.SocketTimeoutException为 已升起,但插座仍处于打开状态 有效的必须启用该选项 进入拦网前 行动要有效果。超时 必须大于0。超时值为零是错误的 解释为无限超时

从互联网上的各种帖子中,我读到当使用Socket C API(例如)时,SO_超时是相当不可靠的

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


如果没有,您可以推荐什么技术来对套接字会话设置时间限制?

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


ApacheHtmlClient核心(?)现在能够使用nio套接字,所以看起来他们已经实现了这个概念。不过,我只知道这些。

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

我不知道有哪个现代平台的操作系统平台的网络堆栈被破坏到套接字超时无法工作的程度。但如果有人知道一个真实的例子,请添加它作为评论


我不会担心这种情况,除非您实际上被迫在这样一个损坏的操作系统上支持您的应用程序。我怀疑这将是一个痛苦的练习。

链接是关于sou RCVTIMEO的。问题是关于Socket.setSoTimeout()的。在我所知道的唯一一个平台中,前者不起作用(Solaris的某些版本),后者是使用select()伪造的,它确实起作用。这种方法的契约要求它。你不必担心这个问题,除非有人真的提出了一个平台,而这个平台是我16年来从未见过的。

+1-链接的帖子确实非常混乱。除了UDP无意义的超时之外,他似乎认为您应该能够发送任意大的UDP数据报。但是nio套接字是否能在网络堆栈损坏的操作系统上正常工作是任何人的猜测……您不仅可以取消nio操作,而且选择器。select(长超时)也应该工作。您能保证吗?在网络堆栈损坏的机器上?我想说,您不能这样做,因为您不能假设实现select的系统调用对于套接字也能正常工作。相反,超时值存储在内部,JRE使用轮询系统调用来实现读取超时。