0

我正在使用 httpclient 4.1.2。如果我连接到特定主机 XYZ 并保持客户端程序运行超过 5 到 6 小时,则连接到同一主机 XYZ 开始给出:

org.apache.http.conn.ConnectTimeoutException: Connect to XYZ timed out
        at
org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:377)
        at
org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
        at
org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
        at
org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
        at
org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573)
        at
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
        at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
        at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
        at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)

如果我连接到不同的主机,它将成功。一旦我重新启动我的客户端程序,问题就会消失。通过浏览器连接到同一主机会成功。

服务器是 tomcat 6。客户端和服务器都在 JRE 5 上运行。我设置了连接超时 = 20000 和套接字超时 = 60000。我正在使用 DefaultHttpClient 和 SingleClientConnManager。

4

1 回答 1

1

在这些情况下,我看到了类似的连接问题:

  1. 当程序员在每次请求后没有完全清空 http 响应对象时。特别是当您收到意外的响应代码(例如 500)时 - 您仍然必须清空响应对象。

  2. 当客户端和服务器之间有防火墙/负载均衡器并且请求没有被传递到服务器时。您可以查看您传递的数字标题并确保它不会太高并丢弃那些不必要的标题。

注意:我认为这些超时值非常高。通常,您希望服务器在几秒钟而不是几十秒钟内做出响应。

线路级日志记录可用于调试此类问题。

于 2011-10-11T11:48:45.540 回答