2012-05-12 42 views
2

我有此静态函数basicly使得到的网页的连接时,与它一起发送后的数据,并返回所接收的响应(JSON对象)DefaultHttpClient超时设置为10个secondes但只需要1秒超时

的我遇到的问题是无论我设置了多长时间,它只会在1秒内发生超时,超时时间为6秒,这种情况不会发生。

public static String makeRequest(String path, String info) throws Exception 
{ 
    HttpParams httpParameters = new BasicHttpParams(); 
    int timeoutConnection = 6000; 
    HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 
    int timeoutSocket = 6000; 
    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 

    DefaultHttpClient httpclient = new DefaultHttpClient(httpParameters); 
    HttpPost httpost = new HttpPost(path); 
    StringEntity jsonobj = new StringEntity(info); 
    httpost.setEntity(jsonobj); 
    httpost.setHeader("Accept", "application/json"); 
    httpost.setHeader("Content-type", "application/json"); 
    ResponseHandler responseHandler = new BasicResponseHandler(); 

    String response = httpclient.execute(httpost, responseHandler); 
    return response; 

现在我已经看到了类似这样的问题,但我找不到可以帮助我的答案。 有人说这是由于它不是线程安全的事实,但是,我不会同时进行多个调用,它都是按顺序完成的。这个问题发生在第一次尝试时,因为这个原因,不应该发生,因为没有多个连接/ httpposts,更不用说来自不同的线程。

然而它最近发生了很多,有时几天甚至几天都没有发生。

我试图寻找在AndroidHttpClient,但它似乎并不支持HttpPost,这样就不会有用或者(或我错了吗?)

的数据,两者的路径和方式是正确的,经过测试它。另外我的服务器没有问题。

有人说它可以是你的网络,但我今天测试了3个wifi网络。勉强,在我的移动提供商的互联网连接上,它不会或几乎不会发生。

我读过一个答案,它可能是因为ISP更改标题信息。我曾尝试为用户代理使用不同的值,但这也不起作用。

我希望有人可以帮助,因为我会感激,因为它真的让我感到挫败,这一直在发生。

回答

2

如果TCP在超时期限之前检测到连接拒绝(即传入RST),则表示失败。在这种情况下等待超时没有任何意义,并且预计重试只会以相同的方式再次失败。超时是针对没有响应的情况。

+0

好的,我已经搜索谷歌(没有很多命中为rst),但据我了解,org.apache.http.conn.ConnectTimeoutException也会因为某些原因无法连接时触发。第一,据我了解,它是TCP协议的连接重置位,用于重置连接。这很可能是问题所在,但为什么会发生这种情况(尤其是使用wifi),并且有没有一种已知的方法来修复它,或者抓住并妥善处理它?因为我尝试过的重试不起作用,它只会一直失败。 – Ghotirey

+1

@Ghotirey RST是一个'积极'的失败。连接已被肯定地拒绝,无论是由主机,因为没有监听端口,或通过防火墙,因为它不会允许连接。在任何一种情况下,重试都是徒劳的。超时是针对没有收到响应的情况,这可能表明数据包丢失或连接暂时中断,所以值得重试。 – EJP