代码之家  ›  专栏  ›  技术社区  ›  corgrath

套接字的连接和读取超时有什么区别?

  •  144
  • corgrath  · 技术社区  · 16 年前

    3个问题:

    1. 两者有什么区别 连接 阅读 套接字超时?

    2. 什么? 连接 超时设置为“无限”是指?在什么情况下它能保持在不定式循环中?什么能触发无限循环的消亡呢?

    3. 什么? 阅读 超时设置为“无限”是指?在什么情况下它能保持在不定式循环中?什么能触发无限循环的消亡呢?

    2 回复  |  直到 7 年前
        1
  •  172
  •   Stephen C    7 年前

    1)套接字的连接和读取超时有什么区别?

    连接超时是进行初始连接时的超时,即完成TCP连接握手。读取超时是等待读取数据的超时 . 具体来说,如果服务器在最后一个字节后的秒数后发送字节<timeout>,则会引发读取超时错误。

    2)连接超时设置为“无限”是什么意思?在什么情况下它能保持在不定式循环中?什么能触发无限循环的消亡呢?

    这意味着连接尝试可能永远阻塞。没有无限循环,但是关闭套接字的另一个线程可以阻止连接尝试。(A) Thread.interrupt() 打电话也可以做到…不确定。

    3)读取超时设置为“无限”是什么意思?在什么情况下,它能保持无限循环?什么可以触发无限循环结束?

    意思是打电话给 read 在套接字流上可能永远阻塞。又一次没有无限循环,但是 阅读 可以通过 线程。中断() 调用、关闭套接字,以及(当然)另一端发送数据或关闭连接。


    不是…正如一位评论者所想…套接字打开或空闲时间的超时。

        2
  •  7
  •   ZZ Coder    16 年前

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

    如果该值设置为无穷大,则不会永远等待。这仅仅意味着JVM没有超时,操作系统将负责所有超时。然而,操作系统上的超时可能非常长。在一些慢速网络上,我看到超时长达6分钟。

    即使为socket设置超时值,如果超时发生在本机代码中,它也可能不起作用。我们可以在Linux上通过连接到防火墙阻止的主机或拔下交换机上的电缆来重现这个问题。

    处理TCP超时的唯一安全方法是在另一个线程中运行连接代码,并在线程太长时中断该线程。