2008-08-21 15 views
122

もちろんAjaxは認識していますが、Ajaxの問題は、ブラウザが新しいデータがあるかどうかを頻繁に確認する必要があることです。これによりサーバー負荷が増加します。Webサーバーからブラウザにデータをプッシュする方法はありますか?

頻繁にサーバーをポーリングする以外にも(Ajaxを使用しても)良い方法がありますか?

+0

@Rachel - あなたが他人がやっていることを見ることができるようにライブアップデート。 StackOverflowなどのサイトやGoogleドキュメントなどのコラボレーション用のWebアプリケーションに適しています。 –

+0

2016年にこのようなことをしている人は、この種の通信のためにウェブソケットを選択する方がよいでしょう。 – Shadow

+0

私は確信しています。概念的にはアプリケーションの方が簡単になるように、ポーリング要求の上にトランスポート層を実装し、アプリケーションロジックからポーリングの責任を取り除くことができます。おそらく誰かがすでにこれを実装しているのでしょうか? 編集:明らかにそれはreverse AjaxCometと呼ばれていますが、これまでのところ自分で実装する必要があるようです。これは誰のためのJavaScriptライブラリですか? –

答えて

9

基本的にある彗星(Ajaxは洗浄剤ですので、彗星であるという事実上のパロディー)に見て、「アヤックスを逆に。」これには、各ユーザーが通知を受け取るために長時間のサーバー接続が必要なので、アプリケーションの作成時のパフォーマンスの影響に注意してください。

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

0

は、サーバへの接続が開かれると、それは開いたままにすることができ、前に私はmultipart/x-mixed-replaceを使用していたが、これはIEで動作しませんでしたしながら、サーバが長いコンテンツをプッシュすることができます。

私はあなたはそれがコンテンツ変わらないヘッダを送信するが、接続を開いたままに私はこれをやったことがないではないことで、よりプッシュのように動作しますポーリングで巧妙なものを行うことができると思います。

1

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

-1

jspページを使用している場合は、Java Pushletsも参照できます。

1

永続的なHTTP接続を使用して目標を達成することは可能です。 Comet articleを超えるウィキペディアで

チェックアウトは、それが開始するには良い場所です。

イベントドリブンのサイト(a'la digg spy)やそのラインに沿った何かのものを構築しようとしているのであれば、おそらく隠されたIFRAMEは、接続が閉じないURLに接続し、更新を実行するためにスクリプトタグをサーバーからクライアントにプッシュします。

4

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

生存しているCallcenterのエージェントとコールキューステータスを更新するWebアプリケーションの一種の「コールセンターコントロールパネル」では、使用できるライブラリからは遠いが動作する社内ソリューションを開発しました。私たちが何をしたか

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

当社のウェブクライアントがこのWebサーバにHTTPを介して接続し、(XMLでコード化された)最後の写真をお願いし、それを表示して、新しい写真を求めて、再び行きます。この時点でウェブサーバすることができます:

  • 戻る1
  • 写真をocurrし、変更するには、いくつかのイベントを待っているいくつかの秒間(私たちのセットアップで30)、クライアントをブロックがある場合、新しい写真、。その時点でイベントが生成されなかった場合は、同じ写真が返され、クライアントがタイムアウトしていない状態で接続が維持されます。

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

これは基本的にポーリングしていますが、Webサーバーを過熱しないように多少ポーリングしています。 Cometがあなたの答えではない場合、私は同じアイデアを使用して実装することができますが、AJAXをより広範囲に使用したり、より良い結果を得るためにJSONでコーディングしたりすることができると確信しています。これはAJAX以前の時代に設計されたものですので、改善の余地があります。

誰かがこれを実際に軽量に実装できる場合は、素晴らしい!

4

興味深いのは、Flashでソケットを使用することです。

0

私たちのComet Componentを試すことができますが、それはですが、極端に実験的です...!

1

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

1

COMET用に設計されたWebサーバーであるMeteor Serverをチェックする価値があります。ニースdemo、それもtwitterfallによって使用されています。

+1

新しいバージョンはhttps://www.meteor.com/で広く普及しています。 –

35

はい、それはとなります。逆Ajaxまたは彗星です。 Cometは基本的に、データをリアルタイムでWebブラウザにプッシュするために、長寿命のHTTPリクエストを開くさまざまな方法の包括的な用語です。 StreamHub Push Serverをお勧めしますが、いくつかのクールなデモがあり、他のどのサーバーよりも始めるのがはるかに簡単です。クイックイントロについては、Getting Started with Comet and StreamHub Tutorialをご覧ください。無料でダウンロードできるCommunity Editionを使用できますが、同時に使用できるユーザー数は20人に制限されています。商用版だけでサポートだけで十分な価値があります。さらに、SSLおよびデスクトップ.N​​ETを入手してください。& Javaクライアントアダプタ。ヘルプはGoogle Groupで利用できます。ネット上にはたくさんのチュートリアルがあり、GWT Comet adapterもあります。

+0

間違いなく、自分で実装すると、再接続、ロングポーリング、iframeのストリーミング、ブラウザ間のサポート、HTTPSなど、どれくらいのことが実現するのでしょうか? – Corehpf

+1

Cometとは何かの説明この回答 –

+0

@原子:簡単な説明を追加しました。他の答えには、Wikipediaの記事へのリンクがあります。 – Nosrama

5

彗星は間違いなくあなたが望むものです。言語/フレームワーク要件に応じて、さまざまなサーバーライブラリが利用できます。たとえば、WebSync is an IIS-integrated comet server for ASP.NET/C#/IIS developersなど、他の言語との統合を強化する必要がある場合は、他のスタンドアロンサーバーもあります。

0

それはあなたがWebSocketをを使用する必要があります

27

今日で利用可能になるように動的クライアントにデータをプッシュする方法を知って、このライブラリhttps://github.com/SignalR/SignalRをチェックしてください。 これは、HTTPとの接続を開始し、双方向のクライアント/サーバーのメッセージベースの通信にアップグレードできる2011標準です。

あなたが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 
}; 

サーバ側の処理は、あなたのtenchnologyスタックに依存します。

+1

対サーバ送信イベント:http://stackoverflow.com/questions/5195452/websockets-vs-server-sent-events-eventsource –

+7

私は全く同意します...双方向通信にHTTPを使用することは、REST呼び出しマリオが亀の殻に飛びつくようにする...それは狂っている。 あなたはリクエストをして、単純なボタンの応答を待つ必要はありません。 HTTPはドキュメントプロトコルです。ハイパーテキスト転送プロトコル。 Ajax Pushは、WebSocketが設計したことを行うためにHTTPを迂回する、非常に複雑な方法です。 goofyをやめて、適切なツールを使用してください。 –

4

さらに、標準的な方法はSSE (Server-Sent Events, also known as EventSourceです(JavaScriptオブジェクトの後)。

+0

最新バージョンのW3C仕様http://www.w3.org/TR/2009/WD-eventsource-20091029/はhttps://html.spec.whatwg.org/multipage/comms.html#server-送信イベント –

関連する問題