クライアント要求なしでサーバーからクライアントにデータをプッシュしますか?


11

Stack Exchangeの閲覧中に、「3つの新しいメッセージ、クリックして表示」などの動的な通知があることに気付きました。説明しようとしていることに対して、このような動的な更新が必要です。

最近のニュース記事10件のカルーセル/スライドショーを作成したいとします。このカルーセルは、キューで1時間ごとに更新されます。新しい記事は、古い記事をキューから押し出します。私の頭の上の解決策は次のようになります。

  1. ユーザーがクライアントにログオンします。
  2. クライアントは、次の時間マークまでの分数を計算し、その時間に実行するタイマーを設定します。
  3. 時間マークで、まだカルーセルに入っていない新しいニュース記事についてサーバーにリクエストを送信します。
  4. 応答を処理します。
  5. タイマーをリセットします。

これは受け入れられる戦略ですか?クライアントのリクエストに依存せずにこれを達成できますか?言い換えれば、Stack Exchangeは動的更新をどのように実現していますか?


4
SignalRをご覧ください。
ロバートハーヴェイ

アイデアについては、RSSおよびAJAXを参照することをお勧めします。RSSはサブスクリプションフィードの標準プロトコルの例であり、AJAXはページをリロードせずにクライアント(ブラウザー)を更新する方法の高レベルの概念です。これがStack Exchangeの仕組みだと思います。


クライアントはブラウザですか、カスタムクライアントですか?
-outis

多少ユーザーに敵意がありますが、HTMLページを15分ごとに更新することもできます。ほとんどのニュースWebページはこれを行います。
ギルバートルブラン

回答:


7

データをプッシュするには、クライアントを識別する必要があります。これは、クライアントをサーバーにサブスクライブすることで実行されます。それが完了すると、永続的な接続を持つサブスクライブされたクライアントのリストができます。

何を達成したいかにもよりますが、クライアントがサーバーにリクエストするのが最善であり、永続的な接続を維持し、HTTPとしてリクエスト/レスポンス通信プロトコルを利用する必要はありません。

永続的な接続を維持するために思い浮かぶ1つの例は、リアルタイムで通信を行う必要があるライブチャット/インスタントメッセージングシステムです。

永続的な接続は通常、を使用socketsして実装されます。これにより、独自の通信プロトコル、暗号化などの実装にオーバーレイが追加されます。


2

基本的に、クライアントにデータをプッシュする必要があり、双方向通信はhttpプロトコルの範囲内にないため、独自に実装するのは簡単ではありません。

問題の解決策はsocket.ioです

ウェブサイトが述べているように、

「Socket.IOは、リアルタイムの双方向イベントベースの通信を可能にします。すべてのプラットフォーム、ブラウザ、またはデバイスで動作し、信頼性と速度に等しく焦点を合わせます。」

これで問題が解決することを願っています。


7
socket.ioに所属しているかどうか、どのように関係しているのか、フレームワークに関する知識/経験に基づいて質問者の問題を解決するのにどのように役立つかを述べれば役立ちます(ウェブサイトの単なる「ミッションステートメント」とは対照的です)
ベニ

WebSocketは、すべての主要なブラウザーが標準を実装しているため、Socket.IOよりも厳密に推奨されています。ほとんどの主要言語にはwebsocket実装がありますが、socket.io実装はありません。Socket.ioはメッセージに構造を追加するため、互換性もありません。
アレックスReinking

1

SEはそれをどのように行うかについて話すことはできませんが、ウェブサイトであるため、データをプッシュするためにphp / asp / what-have-youスクリプトを実行するcronジョブセットを含めることができるいくつかの方法があります。しかし、これはWebのみのソリューションを探している場合です。

しかし、クライアントについて言及しているので、おそらくそのクライアントへの最新のニュース更新の日付/時刻を含むファイルを作成し、クライアントにそのファイルに保存されている値をチェックさせ、それをユーザーのシステム時間と比較して1時間かどうかを確認することができます最後の更新から経過しました。1時間以上経過している場合、クライアントはサーバーに最新のニュースストリームを要求し、サーバーは最新のニュースストリームをクライアントに返します。

ユーザーがタイマーを実行し続けるためにユーザーがクライアントを開いたままにしておく場合にのみ機能するため、タイマーの使用または少なくともタイマーのみの使用は避けます。しかし、あなたが(また)提案したようにファイルを持っている場合、サブルーチンを作成してファイルを開き、時間を変数に保存し、それをシステム時間と比較し、少なくとも1時間であればリクエストを行うことができます。次に、特定のイベントに関連してサブルーチンを呼び出すだけです。ユーザーがクライアントを再起動している場合は、最新のニュースが必要になるため、フォームの読み込み時に必ず呼び出します。彼らがクライアントにいてから数日経っていたら、それは古いニュースを示していたでしょう。少なくともそのサブをクライアントの負荷に結び付けて、提案したとおりにタイマーを開始します。

あなたが何をしようとしているのかを完全に確信していないので、あなたが何をしようとしていたのかを誤解した場合、私は謝罪します。しかし、いずれにせよ、ここに価値のある何かがあなたのためにあることを願っています!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.