Android上的HttpClient:NoHttpResponseException通过UMTS/3G

Android上的HttpClient:NoHttpResponseException通过UMTS/3G,android,http,Android,Http,我有我的android应用程序,它使用HttpClient访问我的servlet 部署在我的雄猫身上。它安装在我的HTC Magic上 如果我在连接Wifi时启动它:它可以工作。 如果我在连接到3G(GSM数据网络)时启动它:它不工作,但我的servlet已到达。换言之,我的手机似乎从未得到响应: Technical problem while receiving response. org.apache.http.NoHttpResponseException: The target serv

我有我的android应用程序,它使用HttpClient访问我的servlet 部署在我的雄猫身上。它安装在我的HTC Magic上

如果我在连接Wifi时启动它:它可以工作。 如果我在连接到3G(GSM数据网络)时启动它:它不工作,但我的servlet已到达。换言之,我的手机似乎从未得到响应:

Technical problem while receiving response.
org.apache.http.NoHttpResponseException: The target server failed to respond
   at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:85)
   at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174)
   at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:179)
   at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235)
   at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259)
   at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279)
   at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121)
   at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:410)
   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
如果我通过3G使用web浏览器激活与servlet打包的测试HTML页面,它将成功地到达同一个servlet(该页面接收响应)

我如何调试HttpClient或要求它转储所有内容


有人知道发生了什么吗?

我终于摆脱了这个问题:只是一个HTTP头被路上的squid服务器处理得很糟糕:

预期:100人继续

android SDK上的DefaultHttpClient似乎默认存在。要解决此问题,只需在代码中添加:

  HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), false);

我也遇到了这个问题。它只偶尔发生,通常是在初始http请求时发生。以后的请求也可以。添加setUseExpectContinue似乎不起作用

在我的案例中,解决方案是添加一个重试处理程序,该处理程序将在特定异常情况下重试请求:

        HttpProtocolParams.setUseExpectContinue(client.getParams(), false);

        HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {

            public boolean retryRequest(IOException exception, int executionCount,
                    HttpContext context) {
                // retry a max of 5 times
                if(executionCount >= 5){
                    return false;
                }
                if(exception instanceof NoHttpResponseException){
                    return true;
                } else if (exception instanceof ClientProtocolException){
                    return true;
                } 
                return false;
            }
        };
        client.setHttpRequestRetryHandler(retryHandler);

Android有一个错误,HTTPS进行反向DNS查找(在冰淇淋三明治中修复)


提到了一个在我手机上可用的解决方案。

您是否检查了服务器日志以查看请求是否是通过网络发出的?如果是这样,您的日志是否告诉您任何事情(例如,服务器端错误)?服务器(非常快)收到请求并成功地给出响应,就像在wifi上处理请求一样。能够调试HttpClient会更有效。。。异常是在很长一段时间后抛出的,大约10分钟,所以我猜,实际上没有任何东西返回到设备。如果这是真的,那么我的反应在空中消失了。我的GSM网络可以进行一些过滤吗?有趣的是,proxy.cwg.net上安装了一个squid服务器,这似乎是原因。但是为什么它在相同的条件下与测试HTML页面一起工作而与HttpClient不一起工作呢?这正是我遇到的问题。。不幸的是,服务器收到第一个请求并更改了一些状态。。再次发送同样的请求真的很糟糕。@PTG在我的情况下不起作用。我将max executionCount设置为50,以检查在多次重试后是否有效。但事实并非如此。还有别的想法吗?顺便说一句,我将它与代理一起使用,然后只得到这个异常。