【问题标题】:HTTP socket closed on Linux, then unable to open it againLinux 上的 HTTP 套接字关闭,然后无法再次打开它
【发布时间】:2010-11-12 17:32:40
【问题描述】:

我们在其中一台客户服务器上遇到问题,似乎有什么东西关闭了 Java 应用程序 HTTP 套接字,之后一段时间内都没有打开。

意思是这样的: 1)应用程序工作正常,然后导致套接字关闭。 2) 任何后续打开它的尝试,包括应用程序重新启动,都会在一段时间内产生“java.net.BindException:地址已在使用”。 3)然后它最终会通过另一个应用程序重新启动来打开套接字。

这是我们第一次看到这样的问题发生,并且被它绊倒了。

它会为任何人敲响警钟吗?

操作系统:2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:14 EDT 2010 x86_64,CentOS 版本 5.5 Java版本:1.6.0_20

谢谢!

【问题讨论】:

    标签: java linux binding


    【解决方案1】:

    似乎您应该告诉您的 Linux 创建允许立即重新绑定的套接字,请参阅 man 7 socket 中的 SO_REUSEADDR

    【讨论】:

    • 哎呀,实际上这似乎是由于我们这边发生的“打开的文件太多”问题 - Java 在此类异常之后表现异常。无论如何添加了 SO_REUSEADDR 以防止将来出现潜在问题。
    【解决方案2】:

    听起来您应该调查“导致套接字关闭的原因”部分。

    【讨论】:

      【解决方案3】:

      至于关闭套接字的原因,您必须调查您的代码。关闭套接字的不是外部的东西,它只能是你的代码。

      当您尝试再次绑定到该套接字时看到的行为是正常的和预期的,并且对于here 的原因有一些解释。

      您可以设置 SO_REUSEADDR 套接字选项来告诉系统继续并允许程序绑定到该端口。对于java,见here

      【讨论】:

        【解决方案4】:

        在套接字的所有排队消息都已成功发送或达到延迟超时之前,您无法进行即时重新绑定,因为套接字延迟。您可以通过SO_LINGER 更改此政策。

        更多信息可以在here(manpage)和here(javadoc)中找到

        至于关闭问题,这似乎是您代码中的一个错误。

        【讨论】:

        • 端口徘徊,而不是套接字。你不应该摆弄 SO_LINGER。 SO_REUSEADDR 可能是他所需要的:更有可能是解决意外退出的原始问题。
        • 事实上你在这里错误地陈述了'linger'的位置。 close() 期间的“Linger”仅在您设置了正的 SO_LINGER 超时时才会发生:它在从套接字发送缓冲区发送待处理数据时阻塞。默认情况下,close() 是异步的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-17
        • 1970-01-01
        • 2018-11-05
        • 2016-02-12
        • 1970-01-01
        相关资源
        最近更新 更多