2012-02-14 13 views
8

私はnodejs + websocketモジュールを使用して、WebSocketを介してクライアントとサーバー間の接続を確立しています。 サーバはクライアントに数回のデータを送信します。私はそれがTCP接続であることを知っていますが、疑わしいことはすべて削除します。 「発光」は連続していますか?最初の "emit"が時刻1sで実行され、2回目が "2s"で実行された場合、クライアントは確実に最初の放出を受け取り、次に2番目の放出を受け取りますか? 最初の送信がまだ受信されておらず、2番目の送信が送信されたらどうなりますか? 発信をブロックしていますか?Websocket:サーバーデータが同期して送信されていますか?

+0

http://stackoverflow.com/q/11804721/632951 – Pacerier

答えて

21

WebSocketはTCP上に構築されています。 TCPは、パケットの配送と順序付けを保証します。さらに、WebSocketsはTCPとは異なり、WebSocketメッセージがメッセージ全体として受信されることを意味します(TCPがストリーミングし、「メッセージ」がリスナーの観点から断片化する可能性があります)。

node.jsでは、同じコンテキスト(同じ関数)から順番に呼び出され、順番に配信されます。しかし、あなたの放出が2つの異なるコールバックにある場合、いつNode.jsがそれらのコールバックをスケジュールするのかを常に保証することはできないので、スケジュールされたコールバックが並べ替えられたため放出が並べ替えられる可能性があります。

アップデート:ここで

は、Node.jsののイベントドリブンな性質は、WebSocketをの意外な並べ替えをもたらすことができる理由を拡張する例です/発する送信:

fs.readFile(file1,function(e,data) { ws.send(data); }); 
fs.readFile(file2,function(e,data) { ws.send(data); }); 

順file1とfile2がブラウザに配信されることは予測できません(キャッシング、ファイルシステムの断片化などの理由でファイルサイズがいつ発火するかを保証するものではありません)。 setTimeoutを使用してfile2のreadFileが1秒後に呼び出されたとしても、ブラウザはそれらを順不同で受信することがあります(file1がはるかに大きく、読み込みに3秒かかる場合、file1の送信はfile2の送信後に行われます) 。

はい、emits/sendsはNode.jsで呼び出された順番でブラウザに受信されますが、Node.jsの非同期イベント駆動型の性質のため、emits/sendsは期待する。

Node.jsの非同期イベントドリブンは、Node.jsに優れた効率とパフォーマンスを与えるものですが、このタイプのコールバックベースのプログラミングに慣れていないと、驚くべき結果が得られます。

+0

"しかし、あなたの放出が2つの異なるコールバックにある場合、いつNode.jsがそれらのコールバックをスケジュールするかを常に保証することはできないので、スケジュールされたコールバックが並べ替えられたため放出が並べ替えられる可能性があります。 - コールバック1がコールバック2の前に実行され、それぞれが放射する場合、コールバック1のemit *はコールバック2の放出前に実行されます。 – einaros

+1

@einaros、それは当てはまりますが、私の指摘は、コールバックは本質的に非同期的であるため、それらが発射する順序を保証することができないということです。コールバックBを登録する前にコールバックを1秒間登録しても、コールバックAのルーチンが完了するのに3秒かかり、Bが1秒しかかからない場合は、Aが最初に登録されていてもAの前にBが発生します。また、I/O完了時に発生するコールバックには、しばしば予期しないタイミングがあります。 – kanaka

+0

特定のイベントの特定の順序で登録されたコールバックが常にこの順序で実行されることを考えると、残りのどれがOPの質問にどのように関係するかはわかりません。それは、放出を引き起こす出来事が順序を変えるならば明らかです。放出物も順序を変えるでしょう。 – einaros

4

メッセージは正しい順序でクライアントに送信されます。

+2

「正しい順序」とは何ですか? 2つのプロセスが** simulatenously ** 1ナノ秒離れて送信する場合、サーバーはその順序で呼び出しを受け取りますか? – Pacerier

+3

@Pacerierあなたの質問には矛盾があります。 – EJP

関連する問題