2013-03-07 82 views
2

对本地主机上运行的客户端和服务器都使用合成加载,我通过tcpdump和netstat验证客户端正在向服务器发送FIN数据包,但连接停留在CLOSE_WAIT中,而请求仍在服务器(我使用排队线程池的Jetty)。当工作线程在池中可用时,即使连接已经被客户端关闭,servlet仍然照常处理该请求。检查HttpServletRequest的连接是否仍然打开?

我想要的是一种方法来测试连接是否已关闭,以防止服务器处理客户端已超时的请求(我知道我可以在客户端上设置一个带有时间戳的http标头并且只要时钟同步,请在服务器上检查它,但我更愿意检查连接以查看它是否仍处于打开状态)。

正在尝试做什么,如果是这样,怎么办?

回答

2

我不这么认为。 FIN并不意味着连接中断。 A发送B一些数据,然后是FIN;那么A继续从B中读取。这个半封闭状态没有任何问题。

您的更好选择是提高服务器吞吐量,以便客户不必等待那么久。

+0

因此,您建议如果我希望客户端超时,并且希望在客户端超时后跳过服务器上的工作,最佳解决方案是在标头中添加时间戳(除了提高服务器响应性)? – jonderry 2013-03-07 02:01:34

+0

是的,如果你控制客户的行为,这将是一个很好的解决方案。 – irreputable 2013-03-07 02:04:12

+0

但是,由于时钟可能不同步,因此服务器在收到请求时为其加上时间戳会更好。我不熟悉码头,不知道该怎么做。 – irreputable 2013-03-07 02:05:43