2009-08-08 18 views
4

からHTTPサーバ私は私の携帯電話(クライアント)上で実行されているJ2MEのアプリを持っている、ポーリングJ2MEクライアント

私は、サーバーとのHTTP接続をオープンして、サーバー上の最新情報のポーリングを維持したいと思います。

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

私は長いポーリングについても聞いたことがありますが、どのように動作し、どれくらい効率的であるかはわかりません。

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

答えて

6

HTTPのみを使用してこの問題を解決したい場合は、long pollingが最適です。それはかなり簡単です。まず、通知用にサーバー側に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. チューニングHTTPのタイムアウトを注意を払わなければならない。1.

    に戻ってください。サーバー。タイムアウトが長いほど、効率的です。タイムアウトした接続は再接続を引き起こします。

  5. 電話機とサーバの両方でHTTPキープアライブをイネーブルにします。 TCPの3ウェイハンドシェイクはGPRS用語では高価ですので、避けてください。
  6. 無効な接続を検出します。モバイル環境では、古いHTTP接続を取得するのは非常に簡単です(接続は終了していますが、ポーリングスレッドはまだ待機しています)。ハートビートを使用して回復することができます。心拍数が5分だとします。サーバーは5分ごとに通知を送信する必要があります。プッシュするデータがない場合は、HEARTBEATを送信してください。ポーリングスレッドは、電話で5分間何も受信しなければ、ポーリング接続を閉じて再開しようとします。
  7. 接続エラーを注意深く処理する。接続の問題がある場合、長いポーリングはうまく機能しません。適切に処理されない場合、それは取引を破ることができます。たとえば、スリープが十分でない場合、ステップ4で多くのパケットを廃棄することができます。可能であれば、携帯電話でGPRSの空き状況を確認し、GPRSがバッテリーを節約するのに利用できないときにポーリングスレッドを保留にします。
  8. サーバーコストは、正しく実装されていないと非常に高くなる可能性があります。たとえば、Javaサーブレットを使用する場合、実行中のすべてのアプリケーションに、少なくとも1つの対応するポーリング接続とそのスレッドがあります。ユーザー数に応じて、これはTomcatをすばやく停止させる可能性があります。Apache Minaのようなリソース効率の良いテクノロジを使用する必要があります。

私はSMSといくつかのIPレベルのトリックの使用のような、電話に通知をプッシュする他のより効率的な方法があると言われました。しかし、あなたは、低レベルの移植不可能なプログラミングをしなければならないか、または特許侵害のリスクに遭遇する必要があります。ロングポーリングは、HTTPのみのソリューションではおそらく最高です。

+0

良い答え!, 私は以下について理解していませんでした: 1.プッシュするイベントがなければ、サーバーはブロックされます。 2.ハートビートとは何ですか? 3. Tomcatにはアクティブユーザー数に制限があります。 –

+1

回答:1.何もプッシュしない場合は、接続を開いたままにしてイベントを待っています。 BlockingQueueをチェックしてください。 2.ハートビートはサーバーが生存していることを電話に伝える管理パケットです。アイドル状態が長すぎる場合は、電話が古くなった接続回復モードになるのを避けるために送信してください。これは高価です。 3. Tomcatのようなサーブレットの場合、各HTTPリクエストはスレッドです。スレッドの数は、実行中のアプリケーションの数に等しくなります。 maxが設定可能であっても、その数が多すぎるとサーバは実行しません。私は数千ではなく数百にとどまるように努めます。 –

1

HEAD HTTP requestは、ページが変更されているかどうかを確認したい場合に、ブラウザやプロキシサーバーがページの更新の有無を確認するためにHTTPを使用する方法です。

HTTPリクエストでは、HEAD要求はGETと同じですが、これは数百バイトに過ぎず、投票があまり頻繁ではないと思われます。

2

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

J2MEのHTTP接続の基本については、tutorialを参照してください。

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

+0

この意味でのポーリングは、サーバーに照会するか、一定の間隔でサーバーに照会することです。 例えば、クライアントはもっと一般的な意味で「私のデータは使えますか?私たちが最後に話して以来何か変わっていますか? クエリは、技術的な意味で、サーバーが理解できる言語で行われます。 –

+0

HEADヘッダーを使用します。 –

+1

HEADはHTTPコンテンツを返送しませんが(本体はありませんが)、GPRSトラフィックを保存することが目標の場合は非常に高額です。敷物の下では多くのことが起こります(3方向TCPハンドシェイク、すべてのヘッダーでの要求と応答)。あなたのメッセージが小さければ、それはGETと何の違いもありません。 –

1

これを行う最善の方法は、ソケット接続を使用することです。 GMailのような多くのアプリケーションで使用されています。

+0

参考資料はありますか?おそらく、AJAXのコードによっては、これを行うことができますか? –

+1

サンプルアプリケーションを作成しようとしました: Midletがサーバーをリッスンしています(私はRubyで書かれたサンプルを使用しています)。 "0"を押してアプリケーションを最小限に抑えることができます。 メッセージが受信された場合は、アプリケーションがポップアップして表示されます。 http://depositfiles.com/files/68ix6gskv (申し訳ありませんが、私はファイルを添付する方法を知らない) –

関連する問題