Android HttpGet выдает исключение NoHttpResponseException в половине случаев?

Я тестировал небольшой встроенный веб-сервер, Веб-сервер (на нем работает многосокетный сервер). Я пытаюсь получить ответ от сервера, используя виртуальные устройства Android в eclipse, и по какой-то причине сервер не отвечает в половине случаев.

вот логкэт ошибки. «on» — это строка, которую сервер ответит в случае успеха.

09-03 23:12:54.672: I/System.out(996): on
09-03 23:12:55.989: I/System.out(996): on
09-03 23:12:57.113: D/dalvikvm(996): GC_FOR_MALLOC freed 882K, 53% free 3142K/6663K,           external 1625K/2137K, paused 37ms
09-03 23:12:57.113: W/System.err(996): org.apache.http.NoHttpResponseException: The target server failed to respond
09-03 23:12:57.122: W/System.err(996):  at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:85)
09-03 23:12:57.122: W/System.err(996):  at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174)
09-03 23:12:57.122: W/System.err(996):  at   org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:179)
09-03 23:12:57.122: W/System.err(996):  at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235)
09-03 23:12:57.122: W/System.err(996):  at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259)
09-03 23:12:57.132: W/System.err(996):  at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279)
09-03 23:12:57.132: W/System.err(996):  at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121)
09-03 23:12:57.132: W/System.err(996):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:421)
09-03 23:12:57.132: W/System.err(996):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
09-03 23:12:57.132: W/System.err(996):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
09-03 23:12:57.132: W/System.err(996):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
09-03 23:12:57.132: W/System.err(996):  at com.SS.Main.TestHttpGet.executeHttpGet(TestHttpGet.java:40)
09-03 23:12:57.132: W/System.err(996):  at com.SS.Main.SmartHomeSystemActivity$1.onClick(SmartHomeSystemActivity.java:32)
09-03 23:12:57.132: W/System.err(996):  at android.view.View.performClick(View.java:2485)
09-03 23:12:57.132: W/System.err(996):  at android.view.View$PerformClick.run(View.java:9080)
09-03 23:12:57.142: W/System.err(996):  at android.os.Handler.handleCallback(Handler.java:587)
09-03 23:12:57.142: W/System.err(996):  at android.os.Handler.dispatchMessage(Handler.java:92)
09-03 23:12:57.142: W/System.err(996):  at android.os.Looper.loop(Looper.java:123)
09-03 23:12:57.142: W/System.err(996):  at android.app.ActivityThread.main(ActivityThread.java:3683)
09-03 23:12:57.142: W/System.err(996):  at java.lang.reflect.Method.invokeNative(Native Method)
09-03 23:12:57.142: W/System.err(996):  at java.lang.reflect.Method.invoke(Method.java:507)
09-03 23:12:57.142: W/System.err(996):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
09-03 23:12:57.142: W/System.err(996):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
09-03 23:12:57.152: W/System.err(996):  at dalvik.system.NativeStart.main(Native Method)

Я попытался сделать обработчик повторных попыток из этого потока.

обработчик повторных попыток

но это, похоже, не помогло (или я использовал его неправильно), поэтому я решил попробовать просто повторно отправить запрос. Вот код, который работает, но я чувствую, что это не очень хороший способ сделать это. У сервера нет проблем, когда браузер с ПК отправляет запрос, но иногда он не отвечает с браузерами Android и эмуляцией приложений. Любые идеи?

 package com.SS.Main;

 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.net.URI;

 import org.apache.http.HttpEntityEnclosingRequest;
 import org.apache.http.HttpRequest;
 import org.apache.http.HttpResponse;
 import org.apache.http.NoHttpResponseException;
 import org.apache.http.client.ClientProtocolException;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.HttpRequestRetryHandler;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.AbstractHttpClient;
 import org.apache.http.impl.client.DefaultHttpClient;
 import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
 import org.apache.http.params.HttpProtocolParams;
 import org.apache.http.protocol.ExecutionContext;
 import org.apache.http.protocol.HttpContext;

 public class TestHttpGet {

 public void executeHttpGet() throws Exception {

    BufferedReader in = null;

    try {
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet();

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


        request.setURI(new URI("http://142.197.135.16:5000/aled.htm?led=on"));

        //HttpResponse response = client.execute(request);

        HttpResponse response = null;

        boolean RetryConnection = true;
        int retrycount = 0;

        //retry request 5 times
        while(RetryConnection == true && retrycount < 5)
        {
            try{
                 response = client.execute(request);
                 RetryConnection = false;
            }catch(IOException e)
            {
                System.out.println("caught");
                retrycount += 1;
            }
        }



        in = new BufferedReader
        (new InputStreamReader(response.getEntity().getContent()));

        StringBuffer sb = new StringBuffer("");
        String line = "";
        String NL = System.getProperty("line.separator");

        while ((line = in.readLine()) != null) {
            sb.append(line + NL);
        }
        in.close();

        String page = sb.toString();

        System.out.println(page);
        } finally {
        if (in != null) {
            try {
                in.close();
                } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
}

person dmoody256    schedule 03.09.2012    source источник
comment
Можете ли вы попробовать это и опубликовать результат? httpResponse.getStatusLine().getStatusCode()   -  person Infinity    schedule 04.09.2012
comment
я напечатал его на консоли, и когда он будет успешным, он напечатает 200, а затем. Есть ли способ прочитать код, когда сервер не отвечает?   -  person dmoody256    schedule 04.09.2012
comment
Возможно, вам придется использовать .addHeader. Взгляните на мой ответ здесь   -  person Ali    schedule 04.09.2012


Ответы (1)


оказывается, проблема была в сервере. Из-за того, как сервер был настроен, ему не хватало времени для обработки входящего запроса. Решение проблемы можно найти по этой ссылке.

Исправление веб-сервера Spinneret

person dmoody256    schedule 05.09.2012