3个问题:
套接字的连接和读取超时有什么区别?
连接超时设置为“无穷大”是什么意思?在什么情况下它可以保持在一个不定式循环中?什么可以触发无限循环死亡?
读取超时设置为“无穷大”是什么意思?在什么情况下它可以保持在一个不定式循环中?什么可以触发无限循环死亡?
答案 0 :(得分:181)
1)套接字的连接和读取超时之间有什么区别?
连接超时是初始连接的超时时间;即完成TCP连接握手。读取超时是等待读取数据 1 的超时。具体来说,如果服务器无法发送一个字节< timeout>在最后一个字节后的几秒钟,将引发读取超时错误。
2)连接超时设置为“无穷大”是什么意思?在什么情况下它可以保持在一个不定式循环中?什么可以触发无限循环死亡?
这意味着连接尝试可能永远阻止。没有无限循环,但是连接尝试可以被关闭套接字的另一个线程解除阻塞。 (Thread.interrupt()
电话也可以做到这一点......不确定。)
3)读取超时设置为“无穷大”是什么意思?在什么情况下它可以保持无限循环?什么可以触发无限循环结束?
这意味着对套接字流的read
的调用可能永远阻塞。再一次没有无限循环,但read
可以被Thread.interrupt()
调用解锁,关闭套接字,(当然)另一端发送数据或关闭连接。
1 - 它不是......正如一位评论者所认为的那样......套接字可以打开或空闲的时间超时。
答案 1 :(得分:7)
这些是JVM强制执行TCP连接并等待从套接字读取数据的超时值。
如果该值设置为无穷大,则不会永远等待。它只是意味着JVM没有超时,操作系统将负责所有超时。但是,操作系统的超时可能很长。在一些缓慢的网络上,我看到超时时间长达6分钟。
即使您为套接字设置了超时值,如果在本机代码中发生超时,它也可能无效。我们可以通过连接到被防火墙阻止的主机或拔掉交换机上的电缆来重现Linux上的问题。
处理TCP超时的唯一安全方法是在不同的线程中运行连接代码,并在花费太长时间时中断线程。