2010-12-05 12 views
2

node.js経由でデータをクライアントに定期的にプッシュするサーバーサイドのソリューションを作成しようとしています(クライアントサイドのポーリングなし)。接続は永続的に開かれていなければならず、サーバーに新しいデータがあるときは、それをクライアントにプッシュダウンします。node.js - データをクライアントにプッシュ - 1つのクライアントのみを接続できますか?

は、ここに私の簡単なサンプルスクリプトです:

var sys = require('sys'), 
http = require('http'); 
http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    sys.puts('Start sending...'); 

    setInterval(function(){ 
     res.write("<script type='text/javascript'>document.write('test<br>')</script>"); 
    }, 10000); 
}).listen(8010); 

は、この基本的に動作しますが、同時に複数のクライアントが接続することができるようです。

ブラウザでhttp://127.0.0.1:8010/を開くと、新しい出力が10秒ごとに表示されます。しかし、同じURLの別のタブを開くと、永久に読み込まれます。私が最初のタブを閉じると、私はサーバーからconentを得る。

複数のクライアントをサーバーするには何が必要ですか?

+0

これは奇妙です。このページによれば、動作するはずです:http://blog.nemikor.com/2010/05/21/long-polling-in-nodejs/ – thejh

+0

@thejh Hm、resで簡単な応答を返そうとしても。 end()(彗星なし、単純なリクエスト - レスポンス)、私は、クライアントがサーバーからコンテンツを取得するために前のものを待たなければならないように思えます。たぶんそれはいくつかのOSの問題ですか?私はubuntuのVM웨어でnode.js 0.3.2を実行しています。 – Max

+0

@Max:あなたはバージョンについて確かですか? githubでも0.3.1が最新のものだと言われています... https://github.com/ry/node – thejh

答えて

3

これは間違いなくバグです。ブラウザは、keep-aliveとHTTP/1.1とノードのネジアップのために同じ接続を再利用します。

これはOpera11の仕事で見ることができます。ページを2回開くと、まったく同じページであり、まったく同じ接続を使用しています。

設定されていないすべてのカーブConnection: keep-aliveはうまく動作しますが、ブラウザは同じページを2回開くことができません。 'localhost:8010'と 'localhost:8010/foo'を開くことはできますが、両方のページで動作します。

注:なし接続の再使用がないので、これが唯一のPOST要求がうまく動作する、GET要求に影響を与えます。

私はこれにissueを提出しました。

+0

ええ、これは何か回避策がありますか?これに関するバグレポートを提出してくれてありがとう! :-) – Max

+0

'GET'リクエストの代わりに' POST'リクエストを行う必要があります(ブラウザはその接続を再利用しません)。iircだから、ここで 'XMLHttpRequest'を実行する必要があります要求の種類を設定できますが、プレーンなHTTPは単にatmに失敗します。 –

3

socket.ioを使用してください。それはあなたのためのすべての重い持ち上げを処理し、本当にクールな図書館です。

1

これに注意してください!

node.jsであり、同時にブロッキングは1回のみである。あなたがしたことは、ノードを死んだ状態に置くことです。そのため、最初のノードを閉じるときに2番目のクライアントのデータが表示されます。

関連する問題