4

携帯電話(クライアント)でJ2MEアプリを実行していますが、

サーバーとのHTTP接続を開き、サーバー上の更新された情報をポーリングし続けたいと思います。

GPRSの課金は送受信されたパケットに基づいているため、実行されるすべてのポーリングはGPRSバイトを使い果たし、長期的にはコストがかかることになります。HTTPプロトコルを使用してバイト効率でポーリングする方法はありますか?

長いポーリングについても聞いたことがありますが、それがどのように機能し、どれほど効率的かはわかりません。

実際には、サーバーが電話アプリに新しいデータを使用する準備ができていることを通知するのが好ましい方法です。そうすれば、ポーリングを実行する必要はありませんが、特にJ2MEではこれらの手法を知りません。

4

4 に答える 4

6

HTTP のみを使用してこの問題を解決したい場合は、ロング ポーリングが最適な方法です。それはかなり簡単です。最初に、サーバー側で通知用の URL (例: http://example.com/notify) をセットアップし、通知プロトコルを定義する必要があります。プロトコルは、いくつかのテキスト行と同じくらい単純にすることができ、各行はイベントです。例えば、

  MSG user1
  PHOTO user2 album1
  EMAIL user1
  HEARTBEAT 300

電話のポーリング スレッドは次のように機能します。

  1. 通知 URL への HTTP 接続を確立します。J2ME では、GCF HttpConnection を使用できます。
  2. プッシュするイベントがない場合、サーバーはブロックします。
  3. サーバーが応答する場合は、各行を取得し、新しいスレッドを生成してアプリケーションに通知し、#1 にループバックします。
  4. 何らかの理由で接続が切断された場合は、しばらくスリープしてから手順 1 に戻ります。

次の実装の詳細に注意を払う必要があります。

  1. クライアントとサーバーの両方で HTTP タイムアウトを調整します。タイムアウトが長いほど効率的です。接続がタイムアウトすると、再接続が発生します。
  2. 電話とサーバーの両方で HTTP キープアライブを有効にします。TCP の 3 ウェイ ハンドシェイクは GPRS 用語ではコストがかかるため、避けるようにしてください。
  3. 古い接続を検出します。モバイル環境では、古い HTTP 接続を取得するのは非常に簡単です (接続は失われていますが、ポーリング スレッドはまだ待機中です)。ハートビートを使用して回復できます。心拍数が 5 分だとします。サーバーは 5 分ごとに通知を送信する必要があります。プッシュするデータがない場合は、HEARTBEAT を送信します。電話では、ポーリング スレッドは、5 分間何も受信されない場合、ポーリング接続を閉じてから再開しようとする必要があります。
  4. 接続エラーを慎重に処理します。接続に問題がある場合、ロング ポーリングはうまく機能しません。適切に処理しないと、取引が破綻する可能性があります。たとえば、スリープ時間が十分でない場合、ステップ 4 で大量のパケットを浪費する可能性があります。可能であれば、電話機で GPRS の可用性を確認し、GPRS が使用できない場合はポーリング スレッドを保留にしてバッテリを節約します。
  5. 適切に実装されていないと、サーバーのコストが非常に高くなる可能性があります。たとえば、Java サーブレットを使用する場合、実行中のすべてのアプリケーションには、少なくとも 1 つの対応するポーリング接続とそのスレッドがあります。ユーザーの数によっては、Tomcat をすぐに殺すことができます :) Apache Mina などのリソース効率の高いテクノロジを使用する必要があります。

SMS やいくつかの IP レベルのトリックを使用するなど、電話に通知をプッシュするより効率的な方法が他にもあると言われました。ただし、低レベルの移植性のないプログラミングを行うか、特許違反のリスクに遭遇する必要があります。ロング ポーリングは、おそらく HTTP のみのソリューションで得られる最善の方法です。

于 2009-08-08T21:08:05.057 に答える
2

「ポーリング」の意味が正確にはわかりませんが、IMAP IDLEのようなものですか? 接続は開いたままであり、接続自体を何度も構築するためのオーバーヘッドはありません。述べたように、別の可能な解決策は、HTTP リクエストの HEAD ヘッダーです (忘れてしまいました、ありがとう!)。

J2ME での HTTP 接続の基本については、このチュートリアルを参照してください。

プッシュ サポートなし (Blackberry など) のアプリケーション/デバイスにデータをプッシュすることはできません。

于 2009-08-08T19:14:31.060 に答える
1

これを行う最良の方法は、ソケット接続を使用することです。Gmailのような多くのアプリケーションはそれらを使用します。

于 2009-08-09T10:08:03.780 に答える
1

HEAD HTTP リクエストは、ページが変更されたかどうかを確認したい場合に HTTP が提供するメソッドであり、ブラウザーやプロキシ サーバーが、帯域幅をあまり消費せずにページが更新されたかどうかを確認するために使用します。

HTTP 用語では、HEAD リクエストは本文のない GET と同じです。これはせいぜい数百バイトであり、ポーリングがあまり頻繁でない場合は許容できると思われます。

于 2009-08-08T19:14:27.330 に答える