私はnodejs + websocketモジュールを使用して、WebSocketを介してクライアントとサーバー間の接続を確立しています。 サーバはクライアントに数回のデータを送信します。私はそれがTCP接続であることを知っていますが、疑わしいことはすべて削除します。 「発光」は連続していますか?最初の "emit"が時刻1sで実行され、2回目が "2s"で実行された場合、クライアントは確実に最初の放出を受け取り、次に2番目の放出を受け取りますか? 最初の送信がまだ受信されておらず、2番目の送信が送信されたらどうなりますか? 発信をブロックしていますか?Websocket:サーバーデータが同期して送信されていますか?
答えて
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に優れた効率とパフォーマンスを与えるものですが、このタイプのコールバックベースのプログラミングに慣れていないと、驚くべき結果が得られます。
"しかし、あなたの放出が2つの異なるコールバックにある場合、いつNode.jsがそれらのコールバックをスケジュールするかを常に保証することはできないので、スケジュールされたコールバックが並べ替えられたため放出が並べ替えられる可能性があります。 - コールバック1がコールバック2の前に実行され、それぞれが放射する場合、コールバック1のemit *はコールバック2の放出前に実行されます。 – einaros
@einaros、それは当てはまりますが、私の指摘は、コールバックは本質的に非同期的であるため、それらが発射する順序を保証することができないということです。コールバックBを登録する前にコールバックを1秒間登録しても、コールバックAのルーチンが完了するのに3秒かかり、Bが1秒しかかからない場合は、Aが最初に登録されていてもAの前にBが発生します。また、I/O完了時に発生するコールバックには、しばしば予期しないタイミングがあります。 – kanaka
特定のイベントの特定の順序で登録されたコールバックが常にこの順序で実行されることを考えると、残りのどれがOPの質問にどのように関係するかはわかりません。それは、放出を引き起こす出来事が順序を変えるならば明らかです。放出物も順序を変えるでしょう。 – einaros
- 1. Guzzleが同期要求を送信しています
- 2. ReactJS - サンク - 2つのイベントが次々に同期して送信されます。
- 3. フォームは同期または非同期で送信されますか?
- 4. Websocketを介してオブジェクトの配列を送信しますか?
- 5. Guzzle非同期POSTリクエストが送信されない
- 6. IEの外部で同期送信が実行されない
- 7. 送信ボタンが送信されていますが保存しません - MVC
- 8. int:outbound-websocket-adapterがMESSAGEフレームを送信しています。私はSENDフレームを期待しました
- 9. 送信済みアイテムフォルダのメールが正しく同期していません
- 10. Objective Cで実際に非同期でメッセージを送信していますか?
- 11. Socket.IO Websocket FirefoxとChromeでメッセージが送信されない
- 12. laravelイベントは、同期して実行されていますか?
- 13. イベントをビデオストリームに同期させて送信する
- 14. トリガアイテムアドオンを使用して送信トレイからアイテムが送信されているときに送信する
- 15. カウボーイとwebsocketで非同期にデータを送信するにはどうすればよいですか?
- 16. ajaxリクエストを送信して応答を受信(同期)
- 17. チャットプログラムでメッセージを送信したクライアントにメッセージが送信されています
- 18. 非同期データがudpソケットからTextBoxに同時に送信される
- 19. 同期チャットプログラムを同期してメッセージを送受信する方法は?
- 20. WebSocketを介して送信されたJSONデータからSwiftでPOSTリクエストを送信
- 21. オブジェクトがソケットを介して送信されていません
- 22. 確認リンクが送信されても確認リンクが送信されないPHPメールが送信される
- 23. 同期シンボルの送信時にPシンボルが表示される
- 24. ボタンが予期せずフォームを送信しています
- 25. HTMLボタンが押されずに送信されています
- 26. Websocket - ブラウザwebsocketがサーバーからのメッセージを受信していません
- 27. Android放送が順番に受信されていますか?
- 28. 空のフォームがデータベースに送信されていますか?
- 29. ArrayBufferとして送信されたデータがBlobとして受信されています
- 30. なぜShowModalで同期がロックされていますか?
http://stackoverflow.com/q/11804721/632951 – Pacerier