これは私を数日間夢中にしています。説明と理解は非常に難しいですが、私は最善を尽くします。どこか不明な点がある場合は質問してください。この問題は、画像のように300Kbを超える大きなパケットを送信している場合にのみ発生します。小さなパケットを送信すると正常に動作します。Android HttpClientとJSON-RPCサーバーは応答を得ず、EDGEで再試行を続けます
私は、PythonベースのJSON-RPCサーバーと通信するAndroidサービスを提供しています。 WiFiや3Gを介して通信するときはすべて正常に動作します。しかし、EDGEを介して通信する場合、すべてがひどく間違っています。 AndroidアプリはHttpClientとHttpPostを作成します。要求は行われますが、応答はサーバーから受信されません。私はいくつかのログ文を '実行'要求の前と後に置いてきました。また、最初の試行が失敗した場合は、再度要求が行われたように見えます。私はそれぞれの "キャッチ"ブロックにログステートメントを持っており、それらのどれも実行されていないので、HTTPリクエストは何とか内部的に再び行われたようです。
私は自分のサーバー上でRPCコードを調べていますが、そこから私が知ることができます。ソケット接続が行われ、データがソケットから読み取られます。 netstatを調べると、確立された接続が数秒間表示され、CLOSE_WAITに入ります。それが起こるとすぐに、ソケットからデータが読み込まれなくなり(明らかに)、ソケット接続が終了するまでサーバーは連続ループに入ります。この時点で、私はJSON-RPCサービスを強制終了し、それをオフにしています。もし私がそれを殺さなければ、サービスはCPUの100%を占め、私はそれを約5分間座らせて、ソケットをシャットダウンするようには見えませんでした。ここ
は、AndroidデバイスからのRPCコールを行うコードである:
DefaultHttpClient client = new DefaultHttpClient();
try {
HttpPost post = new HttpPost(url);
post.setHeader("Content-Type", "application/json");
post.setEntity(new ByteArrayEntity(data));
// I tried these lines on the HttpPost but didn't seem
// to make a difference.
HttpProtocolParams.setVersion(client.getParams(), HttpVersion.HTTP_1_1);
HttpProtocolParams.setUseExpectContinue(client.getParams(), false);
// This doesn't seem to do anything at all...
client.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false));
Log.d("MyAppName", "** About to make HTTP request");
String json = client.execute(post, new BasicResponseHandler());
Log.d("MyAppName", "** Returned from HTTP request!");
JSONObject obj = new JSONObject(json);
if (obj.isNull("result")) {
rtnval = obj.getJSONObject("error").getString("message");
} else {
// More code here...
}
} catch (ClientProtocolException cpe) {
Log.e("MyAppName", "EXCEPTION: " + cpe.getMessage());
} catch (IOException ioe) {
Log.e("MyAppName", "EXCEPTION: " + ioe.getMessage());
} catch (JSONException je) {
Log.e("MyAppName", "EXCEPTION: " + je.getMessage());
} finally {
client.getConnectionManager().shutdown();
}
RPC側の「問題」のコードがでwhileループに(Python2.7)SimpleXMLRPCServer.pyに実際にありますライン#487。 "self.rfile.read"という行は、size_remainingを減らさず決してループを離れることのない0バイトを連続的に得るものです。私はそれについてあまり心配していません、なぜ私は本当に接続が殺されているのか知りたいですが、私は完全性のために質問に追加しました。
私はHTTP接続がCLOSE_WAITにどのように進んでいるのか把握しようとしています。それはAndroidデバイスから来ているようですが、私は確かにそれを把握することはできません。 ByteArrayEntityをチャンクに設定しようとしましたが、JSON-RPCに必要な "Content-Length"ヘッダーが省略されているようです。
誰かが私がその接続を長く開いておくか、閉じられないようにするために何ができるか考えているなら、私はそれを高く評価します。また、HTTPリクエストが再試行されないようにしたいと思います。何か助けてくれてありがとう!
ありがとうございます。私はあなたが正しいと思う、私はちょうどそれがAndroid側で実装されている時間の地獄を持っている。あなたが言っていることは、私がやろうとしていることと私が読んできたことに意味があります。 – themanatuf