【问题标题】:What are some common SocketExceptions and what is causing them?有哪些常见的 SocketExceptions 以及导致它们的原因是什么?
【发布时间】:2026-02-10 07:30:01
【问题描述】:

我被发现捕获了属于亚种的 SocketException,例如 Broken pipeConnection reset。问题是一旦他们被抓住了如何处理滑溜溜的混蛋。

我可以愉快地忽略哪些,哪些需要进一步关注?我正在寻找不同 SocketExceptions 及其原因的列表。

【问题讨论】:

    标签: java error-handling


    【解决方案1】:

    在Java web开发方面,Broken pipe或者Connection reset基本上意味着对方已经关闭了连接。这可能是由于客户端在请求仍在运行时按 Esc 或在请求仍在运行时通过链接/书签/地址栏导航离开引起的。您经常在长时间运行的请求中看到此特定错误,例如大文件下载和不必要的大/慢业务任务(这对不耐烦的用户不利,大约 3 秒确实是最大值)。在极少数情况下,它也可能是由硬件/网络问题引起的,例如服务器或客户端的网络中断。

    当调用响应的输出流上的flush()close() 时,可能会引发此异常。你作为服务器端不能对它做任何事情。由于 HTTP 中的安全限制,您无法(重新)连接客户端,因此您无法从中恢复。在大多数情况下,您甚至不应该尝试,因为这通常是客户自己的决定。忽略它或记录它以获取纯统计信息。

    【讨论】:

      【解决方案2】:

      其他原因之一通常是操作系统上的 TCP/IP 堆栈设置。尚未在 Linux 上尝试过,但我使用过的一个平台是 Sun 的 Solaris 9/10 操作系统。基本思想是 Solaris 有一个可调整的 TCP/IP 堆栈,您可以在运行 Web 应用程序时对其进行调整。

      所以有两个参数你应该注意

      • tcp_conn_req_max_q0 - 不完整握手队列
      • tcp_conn_req_max_q1 - 完整握手队列
      • tcp_keepalive_interval - 保持活跃
      • tcp_time_wait_interval - 被认为是活跃的 TCP 段的时间 在互联网上

      以上所有参数都会影响系统可以承受的负载量(从 TCP/IP 的角度来看),另一方面会影响某些类型的 SocketExceptions 的发生 - 例如上面 BalusC 指出的那些。

      这显然很令人费解,但我想说的是,您经常托管应用程序的操作系统会为您提供缓解策略。

      【讨论】:

        最近更新 更多