启用/禁用SO_TIMEOUT 指定的超时,以毫秒为单位。 使用此选项设置为非零 超时,对()的read()调用 与此相关的InputStream 套接字将仅阻止此数量 时间如果超时到期,a java.net.SocketTimeoutException是 虽然Socket仍然存在但仍然提升了 有效。必须启用该选项 在进入阻止之前 操作有效。超时 必须是> 0.超时为零 被解释为无限超时。
从互联网上的各种帖子中我都看到SO_TIMEOUT在使用Socket C API时非常不可靠(例如here)。
因此,问题是,使用setSoTimeout
检查失控会话是否可靠?
如果没有,您建议使用哪些技术对套接字会话设置时间限制?
答案 0 :(得分:3)
我不知道任何相关的最新/当前操作系统,其中(流)套接字超时不能正常工作。您链接的帖子来自一个相当混乱的海报,它试图在数据报套接字上设置发送超时,这完全没有意义。数据报要么立即发送,要么以静默方式丢弃。
答案 1 :(得分:2)
我不知道任何现代平台操作系统平台,其网络堆栈如此破碎,以至于套接字超时不起作用。但如果有人知道现实生活中的例子,请将其添加为评论!
我不担心这种情况,除非你真的被迫在如此破碎的操作系统上支持你的应用程序。我怀疑这将是一次痛苦的锻炼。
答案 2 :(得分:1)
该链接与SO_RCVTIMEO有关。问题是关于Socket.setSoTimeout()。在唯一的平台中,我知道前者不起作用的地方(某些版本的Solaris),后者使用select()进行捏造,这确实有效。该方法的合同要求它。你不需要担心这个问题,除非有人真正提出了一个我从未在16年内见过的平台。
答案 3 :(得分:0)
查看Java 6 nio中的连接类,它们现在包括套接字并执行非阻塞操作,因此您可以根据需要取消操作。
Apache htmlclient核心(?)现在能够使用nio套接字,所以看起来他们有了这个概念。不过,这就是我所知道的。