2010-06-18 103 views
107

3个问题:套接字的连接和读取超时有什么区别?

  1. 是什么连接阅读超时插座之间的区别?

  2. 什么是连接 timeout设置为“infinity”是什么意思?在什么情况下可以留在不定式循环中?什么会触发无限循环死亡?

  3. 什么是阅读超时设置为“无穷大”是什么意思?在什么情况下可以留在不定式循环中?什么会触发无限循环死亡?

回答

135

1)什么是连接并读取超时插座之间的区别?

连接超时是进行初始连接的超时时间;即完成TCP连接握手。读取超时是等待读取数据的超时。特别是,如果服务器在最后一个字节后超过>秒的时间内未发送字节<,则会引发读取超时错误。

2)连接超时设置为“无穷大”是什么意思?在什么情况下可以留在不定式循环中?什么会触发无限循环死亡?

这意味着连接尝试可能永远阻塞。没有无限循环,但尝试连接可以被关闭套接字的另一个线程解除阻塞。 (A Thread.interrupt()电话也可以做诡计......不知道。)

3)读取超时设置为“无穷大”是什么意思?在什么情况下可以留在不定式循环中?什么会触发无限循环死亡?

这意味着在套接字流上调用read可能会永远阻塞。再一次,没有无限循环,但read可以通过调用Thread.interrupt()解除阻塞,关闭套接字,并且(当然)另一端发送数据或关闭连接。

+0

”读取超时是等待读取数据的超时。“你写了“WAITING”来读取数据?读取超时不是可以打开套接字多长时间的时间? – corgrath 2010-06-18 12:38:57

+0

在Java中,您可以将“无限”设置为连接并且读取超时。我想知道这些情况会如何发生(它将处于一个不定式的循环中)。如果你说连接是用于TCP握手的,那么等待怎么会是不定式的?并非TCP中的所有数据包都被占用? – corgrath 2010-06-18 12:47:24

+4

“读取超时不是插座可以打开多长时间?”那是对的。 “并非TCP中的所有数据包都被占用了?”超时时间表示等待另一端发送SYN-ACK以响应初始SYN数据包的时间。 – 2010-06-18 13:14:33

6

这些是由JVM为TCP连接建立和等待从套接字读取数据强制执行的超时值。

如果该值设置为无穷大,则不会永远等待。它只是意味着JVM没有超时,操作系统将负责所有的超时。但是,操作系统的超时时间可能会很长。在一些缓慢的网络中,我看到超时时间长达6分钟。

即使您为套接字设置了超时值,但如果超时发生在本机代码中,它可能无法正常工作。我们可以通过连接到被防火墙阻止的主机或拔下交换机上的电缆来重现Linux上的问题。

处理TCP超时的唯一安全方法是在不同线程中运行连接代码,并在线程过长时中断线程。“

+0

“如果该值设置为无穷大,则不会永远等待。” 只要不是关于“无限”的意义的讨论,它肯定会发生,你等待很长时间。 我们在这里有一个案例,其中'HttpURLConnection.getResponseCode()'挂在apprx上。一个星期,直到我们重新开始这个过程。在JVM端显然没有超时设置,也没有在Linux OS端超时。 – 2013-07-16 13:09:57

+0

最后一段不正确。最多一分钟后,连接将超时。单独的线程是完全不必要的。如果没有数据,你当然可以拥有永久运行的*读取*。但是,Javadoc错误地认为默认连接超时是无限的。事实并非如此。 – EJP 2013-08-19 23:01:13

+1

@comeGetSome这是不正确的。您可以关闭套接字进行输入。这会导致被阻塞的读取遇到流结束。 – EJP 2016-11-28 02:53:22

相关问题