Java 什么是常见的SocketException,是什么导致了它们?
我被抓到了属于亚种的SocketException,例如断管或连接重置。问题是一旦这些狡猾的混蛋被抓住,该怎么办Java 什么是常见的SocketException,是什么导致了它们?,java,error-handling,Java,Error Handling,我被抓到了属于亚种的SocketException,例如断管或连接重置。问题是一旦这些狡猾的混蛋被抓住,该怎么办 哪些我可以愉快地忽略,哪些需要进一步关注?我正在寻找不同SocketException及其原因的列表。就Java web开发而言,管道断开或连接重置基本上意味着另一方关闭了连接。这可能是由于客户端在请求仍在运行时按Esc键,或在请求仍在运行时通过链接/书签/地址栏导航离开。在长时间运行的请求中,例如大文件下载和不必要的大/慢业务任务(这对不耐烦的用户来说不太好,大约3秒是最长的时间)
哪些我可以愉快地忽略,哪些需要进一步关注?我正在寻找不同SocketException及其原因的列表。就Java web开发而言,管道断开或连接重置基本上意味着另一方关闭了连接。这可能是由于客户端在请求仍在运行时按Esc键,或在请求仍在运行时通过链接/书签/地址栏导航离开。在长时间运行的请求中,例如大文件下载和不必要的大/慢业务任务(这对不耐烦的用户来说不太好,大约3秒是最长的时间),您经常会看到这种特殊错误。在极少数情况下,它也可能由硬件/网络问题引起,例如服务器或客户端的网络中断
调用响应输出流上的
flush()
或close()
时,可能会引发此异常。作为服务器端,您不能对它做任何事情。由于HTTP中的安全限制,无法(重新)连接客户端,因此无法从中恢复。在大多数情况下,您甚至不应该尝试这样做,因为这通常是客户自己的决定。就Java web开发而言,管道破裂或连接重置基本上意味着另一方关闭了连接。这可能是由于客户端在请求仍在运行时按Esc键,或在请求仍在运行时通过链接/书签/地址栏导航离开。在长时间运行的请求中,例如大文件下载和不必要的大/慢业务任务(这对不耐烦的用户来说不太好,大约3秒是最长的时间),您经常会看到这种特殊错误。在极少数情况下,它也可能由硬件/网络问题引起,例如服务器或客户端的网络中断
调用响应输出流上的
flush()
或close()
时,可能会引发此异常。作为服务器端,您不能对它做任何事情。由于HTTP中的安全限制,无法(重新)连接客户端,因此无法从中恢复。在大多数情况下,您甚至不应该尝试这样做,因为这通常是客户自己的决定。忽略它或记录它以获取纯粹的统计信息。另一个原因通常是操作系统上的TCP/IP堆栈设置。我还没有在Linux上尝试过,但我使用过的一个平台是Sun的Solaris 9/10操作系统。基本思想是Solaris有一个可调的TCP/IP堆栈,您可以在运行web应用程序时对其进行调优
因此,有两个参数需要注意
- tcp_conn_req_max_q0-不完全握手队列
- tcp_conn_req_max_q1-完全握手队列
- tcp_keepalive_间隔-keepalive
- tcp_time_wait_interval—被视为活动的tcp段的时间 在互联网上
这显然很复杂,但我想指出的一点是,您经常使用的操作系统为您提供了缓解策略。另一个原因通常是操作系统上的TCP/IP堆栈设置。我还没有在Linux上尝试过,但我使用过的一个平台是Sun的Solaris 9/10操作系统。基本思想是Solaris有一个可调的TCP/IP堆栈,您可以在运行web应用程序时对其进行调优 因此,有两个参数需要注意
- tcp_conn_req_max_q0-不完全握手队列
- tcp_conn_req_max_q1-完全握手队列
- tcp_keepalive_间隔-keepalive
- tcp_time_wait_interval—被视为活动的tcp段的时间 在互联网上