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