什么是常见的SocketExceptions以及导致它们的原因?

时间:2009-12-09 12:05:42

标签: java error-handling

我遇到了捕获属于亚种的SocketExceptions,例如断管连接重置。问题是,一旦他们被抓住,该怎么处理滑溜的混蛋。

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

所以你应该注意两个参数

  • tcp_conn_req_max_q0 - 不完整握手队列
  • tcp_conn_req_max_q1 - 完整握手队列
  • tcp_keepalive_interval - keepalive
  • tcp_time_wait_interval - 被视为活动的TCP段的时间 在互联网上

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

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