Webサーバーからブラウザーにデータをプッシュする方法はありますか?


134

もちろん私はAjaxを知っていますが、Ajaxの問題は、ブラウザーがサーバーを頻繁にポーリングして、新しいデータがあるかどうかを確認する必要があることです。これにより、サーバーの負荷が増加します。

サーバーを頻繁にポーリングする以外に、Ajaxを使用するよりも良い方法はありますか?


1
あるかわかりません。アプリケーションの概念をシンプルにするために、ポーリング要求の上にトランスポート層を実装し、アプリケーションのロジックからポーリングの責任を取り除くことができると思います。たぶん誰かがすでにこれを実装していますか?<strong>編集:</ strong>どうやら<a href=" en.wikipedia.org/wiki/Reverse_Ajax"> reverse Ajax </a>および<a href = " en.wikipedia.org/wiki/Comet_( programming) "> Comet </ a >ですが、これまでのところ、自分で実装する必要があるようです。このためのJavaScriptライブラリはありますか?
Anders Sandvig 08

1
@Rachel-他のユーザーが何をしているかを確認できるように、ライブアップデート。StackOverflowなどのサイトや、Googleドキュメントなどのコラボレーション用のWebアプリケーションに適しています。
Itai Bar-Haim 2012

1
2016年にこの種のことをする人なら誰でも、おそらくこの種のコミュニケーションにはWebソケットの方が適していると思うでしょう。
シャドウ

回答:



37

はい、Reverse AjaxまたはCometと呼ばれています。コメットは基本的に、データをリアルタイムでWebブラウザーにプッシュするために、存続期間の長いHTTPリクエストを開くさまざまな方法の包括的な用語です。私はStreamHub Push Serverをお勧めします。いくつかの素晴らしいデモがあり、他のどのサーバーよりも使い始めるのがはるかに簡単です。簡単な紹介については、Getting Started with CometとStreamHubチュートリアルご覧ください。無料でダウンロードできるCommunity Editionを使用できますが、同時ユーザー数は20に制限されています。商用バージョンは、サポートだけでも十分価値があり、SSLとデスクトップ.N​​ETとJavaクライアントアダプターを利用できます。Googleグループからヘルプを利用できます、ネット上にはたくさんのチュートリアルがあり、GWTコメットアダプターもあります。


1
間違いなく進むべき道、自分で実装に
取り掛かると、やり直し

2
彗星とは何かの説明がこの答えに役立つでしょう
ケビンモンク

1
@Satir:簡単な説明を追加しました。その他の回答には、Wikipediaの記事へのリンクがあります。
Nosrama 2009

32

今日では、WebSocketを使用する必要があります。これは2011年の標準であり、HTTPで接続を開始してから、クライアントとサーバー間の双方向のメッセージベースの通信にアップグレードできます。

javascriptから簡単に接続を開始できます。

var ws = new WebSocket("ws://your.domain.com/somePathIfYouNeed?args=any");
ws.onmessage = function (evt) 
{
  var message = evt.data;
  //decode message (with JSON or something) and do the needed
};

サーバー側の処理は、テンチノロジースタックによって異なります。



8
私は完全に同意します...双方向通信にHTTPを使用することは、REST呼び出しでマリオを亀の甲羅にジャンプさせることを考えるようなものです...それは狂気です。単純なボタン押しで人を要求して応答を待つ必要はありません。必要はありません。HTTPはドキュメントプロトコルです。ハイパーテキスト転送プロトコル。Ajax Pushは、HTTPを迂回してWebSocketが意図的に行うことを実行するめちゃくちゃ複雑な方法です。間抜けになるのをやめて、仕事に適したツールを使用してください。
Nick Steele

あなたは本当に楕円が好きです、そして時々私が「楕円」と呼ぶ4つのドットの新しい形!
imbatman

10

基本的に「逆Ajax」である彗星(Ajaxが洗浄剤であるという事実の偽装)を調べます。これには、通知を受け取るために各ユーザーが長期間のサーバー接続を必要とすることに注意してください。アプリを作成するときは、パフォーマンスへの影響に注意してください。

http://en.wikipedia.org/wiki/Comet_(programming)



5

Cometに時間をかけることを強くお勧めしますが、実際に使用できる実装やライブラリを知りません。

ライブCallcenterのエージェントとコールキューステータスの更新を伴うWebアプリの一種の「コールセンターコントロールパネル」では、機能する社内ソリューションを開発しましたが、使用できるライブラリからは遠く離れています。

私たちが行ったのは、電話システムと通信し、新しいイベントを待機し、状況の写真を維持する小さなサービスをサーバーに実装することでした。このサービスは小さなWebサーバーを提供します。

私たちのWebクライアントはHTTPを介してこのWebサーバーに接続し、最後の写真(XMLでコード化)を要求し、それを表示してから、新しい写真を要求して再び行きます。この時点でのWebサーバーは次のことができます。

  • 新しい写真があれば返します
  • クライアントを数秒間ブロックし(セットアップでは30)、イベントが発生して写真が変更されるのを待ちます。その時点でイベントが生成されなかった場合は、同じ写真が返されます。接続が有効なままで、クライアントがタイムアウトになることはありません。

このように、クライアントがポーリングすると、最大で0〜30秒で応答が返されます。新しいイベントがすでに生成されている場合はすぐにそれを取得します)、それ以外の場合は新しいイベントが生成されるまでブロックします。

それは基本的にポーリングですが、ウェブサーバーをオーバーヒートしないようにいくらかスマートなポーリングです。コメットがあなたの答えではない場合、これは同じアイデアを使用して実装できますが、AJAXまたはJSONでのコーディングをより広範囲に使用してより良い結果を得ることができます。これはAJAX以前の時代に設計されたため、改善の余地はたくさんあります。

誰かがこれの実際の軽量実装を提供できれば、すばらしいです!


5

コメットの興味深い代替手段は、フラッシュでソケットを使用することです。




2

他の方法があります。それらがあなたの状況で「より良い」かどうかわかりません。ページの読み込み時にサーバーに接続し、サーバーからの送信を待機するJavaアプレットを使用できます。起動時はかなり遅くなりますが、ブラウザがポーリングすることなく、サーバーからのデータをまれにしか受信できなくなります。


2

クライアントでFlash / Flexアプリケーションを使用し、サーバー側でBlazeDSまたはLiveCycleを使用できます。RTMP接続を使用して、データをクライアントにプッシュできます。RTMPは非標準ポートを使用することに注意してください。ただし、ポートがブロックされている場合は、簡単にポーリングにフォールバックできます。


2

永続的なHTTP接続を使用することで、目的を達成することができます。

ウィキペディアで彗星の記事をチェックしてください。これは、始めるのに適した場所です。

あなたは多くの情報を提供していませんが、何らかのイベント駆動型サイト(a'la digg spy)またはそれに沿った何かの構築を検討している場合は、おそらく、接続が閉じないURL。次に、更新を実行するためにサーバーからクライアントにスクリプトタグをプッシュします。



1

サーバーへの接続が開かれると、接続を開いたままにして、サーバーでコンテンツをPushできます。 multipart/x-mixed-replaceいたのですが、IEでは機能しませんでした。

私はポーリングで巧妙なことを行うことができると思います。コンテンツを変更されていないヘッダーを送信せず、接続を開いたままにすることで、プッシュのように機能しますが、これを行ったことはありません。





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