私は小さな組み込み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();
}
}
}
}
}