连接和读取套接字的超时有什么区别?
3个问题:
-
连接和读取套接字的超时有什么区别?
-
连接超时设置为“无穷大”是什么意思? 在什么情况下可以留在不定式循环中? 什么会触发无限循环死亡?
-
读取超时设置为“无限”是什么意思? 在什么情况下可以留在不定式循环中? 什么会触发无限循环死亡?
1)套接字的连接和读取超时有什么区别?
连接超时是进行初始连接的超时时间; 即完成TCP连接握手。 读取超时是等待读取数据的超时。 具体而言,如果服务器在最后一个字节之后未能发送字节<timeout>秒,则会引发读取超时错误。
2)连接超时设置为“无穷大”是什么意思? 在什么情况下可以留在不定式循环中? 什么会触发无限循环死亡?
这意味着连接尝试可能永远阻止。 没有无限循环,但连接的尝试可以被closures套接字的另一个线程解除阻塞。 (一个Thread.interrupt()
调用也可以做诡计…不知道。)
3)读取超时设置为“无穷大”是什么意思? 在什么情况下可以留在不定式循环中? 什么会触发无限循环死亡?
这意味着read
套接字stream的调用可能永远被阻塞。 再次没有无限循环,但read
可以通过一个Thread.interrupt()
调用,closures套接字,(当然)另一端发送数据或closures连接。
这些是由JVM为TCP连接build立和等待从套接字读取数据强制执行的超时值。
如果这个值被设定为无穷大,你就不会永远等下去。 这仅仅意味着JVM没有超时,操作系统将负责所有的超时。 但是,操作系统的超时时间可能会很长。 在一些缓慢的networking上,我看到超时只要6分钟。
即使您为套接字设置超时值,如果在本机代码中发生超时,也可能无法正常工作。 我们可以通过连接到被防火墙阻止的主机或者拔掉交换机上的电缆来重现Linux上的问题。
处理TCP超时的唯一安全方法是在不同的线程中运行连接代码,并在需要太长时间时中断线程。