2017-12-31 188 views
1

node.jsサーバーとクライアント接続を開いたままにしておくことは悪い考えですか? (x.end();を使用しないでください)。node.jsにサーバークライアントの応答接続を開いたままにしておくのは悪いですか?

私はnode.jsで遊んでいて、ハングアップしています。これは私がやろうとしていることです: node.js実行可能ファイルをマルチクライアントのオープンハンドルとして使用して通信するお互いに、私がこれまでに試したことは、ちょうど意味のあるHTTPサーバーを作成し、5000msの間隔で「テスト」を作成することです。そして、切断するまでクライアントと永遠にやりとりするこのアイデアを持っているので、私は自分自身がハンドルを終了するのを見ることはできません。

var http = require("http"), 
    date = require("./modules/date.js"); 

var server = http.createServer(function(request, response) { 
    console.log("[" + date.currentTimestamp() + "] Receiving a connection from " + server.address().address); 

    response.writeHead(200, {"Content-Type": "text/html"}); 
    response.write("Hello World!<br>Current time: " + date.currentTimestamp() + "<br>Current url: " + request.url); 
    setInterval(function() { 
     response.write(" test"); 
    }, 5000); 
}).listen(80); 

console.log("[" + date.currentTimestamp() + "] Server has initialized."); 

答えて

2

アイデアはそれほど悪くはありません。ちょうど長いポーリングを再作成しました:) これは、サーバーイベントを送信するために広く使用されているサーバーとクライアントのやりとりのパターンです。それはどのように動作するのですか: 1.クライアントは、サーバーに接続することでイベントを購読します。 2.サーバは接続を可能な限り開いたままにします 3.接続が開いている間にイベントが発生すると、サーバはイベントペイロードとメタデータを返して接続を閉じます。 4.イベントが発生しない場合、非アクティブなクライアントにリソースを費やすのを避けるために、一定の時間が経過すると接続が閉じられます。 5.どちらの場合も、クライアントは再接続し、さらにイベントが発生します。

enter image description here

のWebSocketが導入される前にロングポーリングが発明されました。 WebSocketは、クライアントとサーバーの長いイベント交換のためだけに設計されていますが、長いポーリングはややこしいことです。最良のアイデアは、それをサポートするブラウザ用にwebsocketを使用し、そうでないブラウザ用の長いポーリングにフォールバックすることです。 socket.ioのようないくつかのライブラリは自動的にそれを行うことができます、btw。

3

HTTPプロトコルは要求応答のパラダイムです。会話では、それはあるものと別のものを言っている人になります。コードは機能しますが、プロトコルは設計通りに使用されていません。目標を達成するより良い方法は、websocketを使用することです。 WebSocketは、開いたままにしておき、長時間の接続のためにデータを前後に転送するように設計されています。

+0

ソケットプロトコルの使用について言及するつもりは、OPが意図しているものの管理におそらく最適です。 – simon

関連する問題