web-dev-qa-db-ja.com

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

Stack Exchangeを閲覧しているときに、「3つの新しいメッセージ、クリックして表示」などの動的な通知があることに気付きました。これから説明しようとしていることについて、この種の動的更新を行いたいと思います。

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

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

これは許容できる戦略ですか?クライアントの要求に依存せずにこれを達成できますか?言い換えれば、Stack Exchangeはどのようにして動的な更新を行うのですか?

11
Eric Guan

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

達成したいことに応じて、クライアントがサーバーに要求するのが最善であると私は思います。そのため、永続的な接続を維持し、要求/応答通信プロトコルをHTTPとして利用する必要はありません。

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

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

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

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

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

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

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

2
Alok Saini

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

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

ユーザーがタイマーを実行し続けるためにユーザーがクライアントを開いたままにしている場合にのみ機能するため、タイマーを使用することは避けます。しかし、(もし)私が提案したようにファイルがある場合は、ファイルを開くサブルーチンを作成し、時間を変数に格納し、それをシステム時間と比較して、1時間以上ある場合は要求を行うことができます。次に、特定のイベントに関連してサブルーチンを呼び出すだけです。ユーザーがクライアントを再起動しているだけなら最新のニュースが欲しいので、私は間違いなくフォームの読み込み時にそれを呼び出します。彼らがクライアントにいてから数日が経過している場合は、その古いニュースが表示されます。少なくともそのサブをクライアントに結び付け、あなたが提案したようにタイマーを開始します。理論的には、ユーザーがクライアントを開いたままにしておく限り、タイマーはその機能を実行し続け、タイミングを追跡するアクティブなタイマーがない場合に備えて、サブがロード時に実行されます。

私はあなたが何をしようとしているのか完全に確信が持てないので、あなたが何をしようとしていたのかを誤解してしまって申し訳ありません。しかし、うまくいけば、いずれにせよ、あなたにとってここに価値のあるものが存在します!

1
WeekendRockstar