web-dev-qa-db-ja.com

リクエストがサーバーに送信されたとき、およびインターネット接続が失われた応答を待っているときに何をしますか?

大量のデータをサーバーに送信しています。データを送信してサーバーの応答を待っている間に、突然Androidデバイスがインターネット接続を失いました。
つまり、私が使用していたのは、接続が失われたという警告ダイアログを表示することですが、サーバー側ではデータはすでに処理されており、どこかで更新されています。任意のURL。しかし、私のAndroid電話は、これまでに応答がなかったため、これを知りません。解決方法.
サーバー側でもAndroid自体でも可能ですか?
どのようにサーバーはAndroid電話が応答を聞くつもりはないことを知っていますか?
それは、クライアント/サーバー通信最適化の観点かもしれません。

14
mayank_droid

これは非同期トランザクションのかなり一般的な問題であり、いくつかの部分に分類されます。

  1. トランザクション要求が正常に受信されたことを両側でどうやって知るのですか?
  2. クライアントが適切に受信されていないと思われるトランザクション要求をどのように再送信しますか?
  3. サーバーは最初の要求を正常に受信したときに、クライアントからの繰り返し要求をどのように検出しますか?
  4. クライアントはトランザクション結果をどこから取得するかをどのようにして知るのですか?

HTTPの素晴らしい点は、これらすべての問題をかなり簡単に解決できることです。

次のようなURL構造を想像してください。

 POST  http://my.server.com/application/engine/queue  
 GET  http://my.server.com/application/ engine/results?jobid = 43425

HTTPポストを使用して、一意のクライアント要求IDを使用してサーバーに要求を送信し、サーバーにジョブIDで応答させます。クライアントの観点から見ると、この応答が発生しない場合は、リクエストを再送信する必要があります。サーバーの観点からは、クライアントが重複した要求を送信する場合、クライアント要求IDを数分間キャッシュする必要があります。重複したリクエストは、同じジョブIDをクライアントに返すだけで処理されます。

クライアントは、リクエストの結果を結果URLから取得します。この呼び出しは、結果を取得するために必要なだけ繰り返すことができます。結果が利用可能になる前に呼び出された場合、応答はNO-CONTENT応答になる可能性があるため、クライアントはサーバーがジョブIDを認識しているがまだコンテンツを持っていないことを認識しています。ジョブIDが認識されない場合、NOT-FOUNDが適切な応答です。

最終結果は、ネットワークが失われて回復したときにクライアントが常に賢明なアクションを実行できること、および同様にサーバーが常にクライアントからの要求を慎重に処理できることです

15
Michael Shaw

これは、プロトコル通信の基本に該当します。トランザクションがAndroidクライアントによって要求され、サーバーはトランザクションを実行する必要があります。トランザクションがAndroidクライアントの確認に依存している場合、 ACK/NAK通信を呼び出します。

ACK(確認応答)および NAK(否定確認応答) は、要求の結果を相手側に伝えるために使用されます。

あなたが求めているのは、クライアントとサーバー間の ハンドシェイク 交換の一種であり、基本的なACK/NAK交換で実行できます。

Android双方向の確認応答付きのファイルのアップロードの例を次に示します。

Android -> upload files -> Server
Android <- ACK #id <- Server
Android -> ACK #id -> Server

上記の例では、トランザクションに#id一意の識別子を追加しました。サーバーはファイルを受信し、トランザクションレコードを作成して、Androidに応答として送信する必要があります。 Android次に、そのトランザクションの承認(または、拒否の場合はNAK)が続きます。

Android=ハンドシェイク中に切断する例を示します。

Android -> upload files -> Server
Android <- ACK #id <- Server
/** no ACK response **/

上記の例では、サーバーはアップロードされたファイルを受け入れ、#id ACK応答をAndroidに返しましたが、AndroidがACKで応答することはありません。Androidデバイスがハンドシェイクを完了できませんでした。サーバーがこれを処理する方法を決定するのはあなた次第です。トランザクションを破棄し、トランザクションを保持して、Androidデバイスが後で戻るか、またはとにかくトランザクションを完了します。

サーバーは、デバイスがACKで応答しなかったので、それを想定できます。 Androidデバイスは、アップロードが成功したことを示すためにその内部状態を更新しませんでした。トランザクションを破棄し、今後デバイスがそれを繰り返すことを許可します。

4
Reactgular