2010-01-12 4 views
16

HttpClient를 사용하여 내 서블릿에 도달하는 안드로이드 앱을 가지고 있습니다. 내 서블릿 이 Tomcat에 배포되었습니다. 그것은 내 HTC 매직에 설치됩니다.안드로이드의 HttpClient : UMTS/3G를 통한 NoHttpResponseException

Wifi에 연결하면 실행됩니다. 작동합니다. 3G (GSM 데이터 네트워크)에 연결할 때 실행하면 작동하지 않지만 내 서블릿에 도달했습니다. 다른 한마디로, 내 전화가 응답 결코 보인다 : 내 서블릿으로 패키지되어 테스트 HTML 페이지를 활성화하기 위해 3G를 통해 웹 브라우저를 사용하는 경우

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) 

를, 그것은 성공과 같은 서블릿 (도달 페이지는 응답을받습니다).

어떻게 HttpClient를 디버깅하거나 모든 것을 덤프하도록 요청할 수 있습니까?

누군가가 무슨 일이 일어나고 있는지에 대한 단서가 있습니까?

+0

요청 사항이 서버 로그를 통해 확인하는지 확인 했습니까? 그렇다면 로그에서 아무 것도 알려주나요 (예 : 서버 측 오류)? – CommonsWare

+0

서버가 요청을 받았을 때 (매우 빨리) 응답을 제공합니다. 요청이 Wi-Fi를 사용할 때와 매우 비슷합니다. HttpClient를 디버깅 할 수있는 것이 더 효율적입니다 ... 예외는 오랜 시간이 지난 후에 발생합니다. 10 분 정도 지나면 예외가 발생합니다. 사실이라면 공중에서 내 반응을 잃어 버리는 것입니다. 내 GSM 네트워크에 필터링 기능이 있습니까? – Hubert

+0

흥미롭게도 proxy.cwg.net에 설치되어있는 squid 서버가 원인 인 것 같습니다. 하지만 같은 조건에서 HttpClient가 아닌 테스트 HTML 페이지에서 작동하는 이유는 무엇입니까? – Hubert

답변

11

드디어이 문제를 제거있어 : 단순히 HTTP 헤더 심하게 도로에 오징어 서버에 의해 처리되었다

가 예상 : 100 - 계속은

이있을 것으로 보인다 기본적으로 android SDK의 DefaultHttpClient를 사용합니다. 이 문제를 해결하려면 코드에 다음 코드를 추가하십시오.

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

이 문제도 발생했습니다. 처음에는 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); 
+0

이것은 정확히 내가 겪고있는 문제입니다. 불행히도 서버가 첫 번째 요청을 받고 일부 상태를 변경합니다. 다시 같은 요청을 보내면 실제로는 borks가됩니다 .. – danb

+0

@PTG 제 경우에는 작동하지 않습니다. 너무 많은 재시도 후 작동하는지 확인하기 위해 최대 executionCount를 50으로 설정했습니다. 그러나 그렇지 않았습니다. 다른 생각? BTW, 나는 프록시와 함께 사용하고 나서이 예외를 얻는다. – Geek