2

私は小さな組み込みWebサーバーであるWebサーバーをテストしてきました(マイクGのマルチソケットサーバーを実行しています)。EclipseでAndroid仮想デバイスを使用してサーバーから応答を取得しようとしていますが、何らかの理由でサーバーが半分の時間応答しません。

これがエラーのlogcatです。「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)

このスレッドから再試行ハンドラーを作成しようとしました

リトライハンドラ

しかし、それはそれを修正しなかったようです(または私はそれを間違って使用していました)ので、私はリクエストを再送信し続けることを試みることにしました。これが機能しているコードですが、それを行うには良い方法ではないと思います。PCのブラウザがリクエストを送信する場合、サーバーは問題ありませんが、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();
            }
        }
    }
}
}
4

1 に答える 1

0

問題となったのはサーバーでした。サーバーのセットアップ方法では、着信要求を処理するのに十分な時間がありませんでした。この問題の解決策は、このリンクにあります。

SpinneretWebサーバーの修正

于 2012-09-05T20:39:58.047 に答える