J2MEクライアントからHTTPサーバーを投票します
質問
携帯電話(クライアント)で実行されているJ2MEアプリがあります。
サーバーとのHTTP接続を開き、サーバー上の更新された情報のポーリングを続けたいと思います。
実行されるすべての投票は、GPRSバイトを使い果たし、GPRS請求は送信および受信したパケットに基づいているため、長期的には高価になります。 HTTPプロトコルを使用して、バイト効率的な投票方法はありますか?
長い世論調査も聞いたことがありますが、それがどのように機能し、どれほど効率的かはわかりません。
実際には、事前にフィフルな方法は、サーバーが電話アプリに新しいデータを使用する準備ができていることを伝えることです。
解決
HTTPのみを使用してこの問題を解決したい場合は、 長い投票 最良の方法です。かなり簡単です。最初に、通知のためにサーバー側にURLをセットアップする必要があります(例: http://example.com/notify
)、および通知プロトコルを定義します。プロトコルは、単にいくつかのテキスト行と同じくらい単純になり、各行はイベントです。例えば、
MSG user1
PHOTO user2 album1
EMAIL user1
HEARTBEAT 300
電話の投票スレッドはこのように機能します、
- 通知URLへのHTTP接続を作成します。 J2MEでは、GCF HTTPConnectionを使用できます。
- プッシュするイベントがない場合、サーバーはブロックされます。
- サーバーが応答した場合は、各行を取得し、新しいスレッドをスポーンしてアプリケーションを通知し、ループバックを#1に通知します。
- 何らかの理由で接続が閉じる場合は、しばらく寝て、ステップ1に戻ります。
次の実装の詳細に注意を払う必要があります。
- クライアントとサーバーの両方でHTTPタイムアウトを調整します。タイムアウトが長いほど効率が高くなります。タイミングアウト接続により、再接続が発生します。
- 電話とサーバーの両方でHTTP KeepAliveを有効にします。 TCPの3方向の握手はGPRS用語で高価なので、それを避けてください。
- 古い接続を検出します。モバイル環境では、古いHTTP接続を取得するのは非常に簡単です(接続はなくなりましたが、ポーリングスレッドはまだ待っています)。ハートビートを使用して回復できます。ハートビートレートが5分であるとします。サーバーは、5分ごとに通知を送信する必要があります。プッシュするデータがない場合は、ハートビートを送信してください。電話では、ポーリングスレッドは、5分間受け取っていない場合、ポーリング接続を閉じて再開しようとする必要があります。
- 接続エラーを慎重に処理します。接続性の問題がある場合、長いポーリングはうまくいきません。適切に処理されていない場合、それは取引を破ることができます。たとえば、睡眠が十分に長くない場合は、ステップ4に多くのパケットを無駄にすることができます。可能であれば、電話でGPRSの可用性を確認し、GPRSがバッテリーを保存するために利用できない場合は、ポーリングスレッドを保留にします。
- サーバーのコストは、適切に実装されないと非常に高くなる可能性があります。たとえば、Javaサーブレットを使用する場合、すべての実行アプリケーションには、少なくとも1つの対応するポーリング接続とそのスレッドがあります。ユーザーの数に応じて、これはTomcatを素早く殺すことができます:) Apache Minaのようなリソース効率の高いテクノロジーを使用する必要があります。
SMSやいくつかのIPレベルのトリックを使用するなど、電話に通知をプッシュする他のより効率的な方法があると言われました。しかし、あなたはいくつかの低レベルの非ポート可能なプログラミングを行うか、特許違反のリスクに直面する必要があります。長いポーリングは、おそらくHTTPのみのソリューションで得ることができる最高のものです。
他のヒント
ヘッドHTTPリクエスト ページが変更されたかどうかを確認する場合、HTTPが提供する方法です。ブラウザとプロキシサーバーが使用して、ページが更新されているかどうかを確認しても、帯域幅を多く消費せずに確認します。
HTTPの用語では、ヘッドリクエストはボディなしで取得するのと同じです。これは、投票があまり頻繁ではない場合、ほとんど数百バイトになると思われます。
これを行う最良の方法は、ソケット接続を使用することです。 Gmailのような多くのアプリケーションはそれらを使用しています。