多くの根拠をカバーする他の人からのいくつかの素晴らしい答え。ここで少し余分です。
Javaアプレット、Flash、Silverlightなどのプラグインに対するWebSocketの唯一の利点は、WebSocketがブラウザにネイティブに組み込まれており、プラグインに依存しないことです。
これにより、Javaアプレット、Flash、またはSilverlightを使用してソケット接続を確立できる場合は、可能です。ただし、制限があるため、現実の世界であまり頻繁に展開されることはありません。
たとえば、仲介者はそのトラフィックをシャットダウンできます。WebSocket標準は、既存のHTTPインフラストラクチャと互換性があるように設計されているため、ファイアウォールやプロキシなどの仲介者による干渉を受けにくくなっています。
さらに、WebSocketは、専用のポートを必要とせずにポート80および443を使用できます。これも、既存のHTTPインフラストラクチャと可能な限り互換性のあるプロトコル設計のおかげです。
これらの代替ソケット(Java、Flash、Silverlight)をクロスオリジンアーキテクチャで安全に使用することは困難です。したがって、クロスオリジンを使用しようとする人々は、安全にそれを行う努力に行くのではなく、不安を許容します。
また、追加の「非標準」ポートを開く(管理者が嫌いなことを行う)か、管理する必要のあるポリシーファイルを要求することもできます。
つまり、ソケット接続にJava、Flash、Silverlightを使用することには問題があり、深刻なアーキテクチャーにデプロイされることがあまりありません。FlashとJavaは、おそらく少なくとも10年間この機能を持っていましたが、まだ普及していません。
WebSocket標準は、これらの制限を念頭に置き、うまくいけばそれらからいくつかの教訓を学んだことで、新しいアプローチから始めることができました。
一部のWebSocket実装では、WebSocket接続を確立できない場合(古いブラウザーで実行している場合や、仲介者が干渉している場合など)のフォールバックとしてFlash(またはSilverlightやJava)を使用しています。
これらの状況に対するある種のフォールバック戦略は賢いですが、必要な場合でも、Flashなどを使用するもののほとんどは、上記の欠点に悩まされます。それはそうである必要はありません-Flash、Silverlightなどを使用して安全なクロスオリジン対応接続を実現するための回避策があります-しかし、ほとんどの実装は簡単ではないのでそれを行いません。
たとえば、クロスオリジン接続をWebSocketに依存している場合は、問題なく動作します。しかし、古いブラウザで実行したり、ファイアウォールやプロキシが干渉してFlashに依存したりすると、フォールバックとして、同じクロスオリジン接続を行うのが難しくなります。もちろん、セキュリティを気にしない限り。
つまり、かなりの作業を行う準備ができているか、それをうまく行ったフレームワークを使用する準備ができていない限り、ネイティブ接続と非ネイティブ接続で機能する単一の統合アーキテクチャを持つことは困難です。理想的なアーキテクチャでは、接続がネイティブであるかどうかに気付かないでしょう。セキュリティ設定はどちらの場合でも機能します。クラスタリング設定は引き続き機能します。キャパシティプランニングは引き続き有効です。等々。
HTTPストリーミングに対するWebSocketの唯一の利点は、受信したデータを「理解」して解析するための努力をする必要がないことです。
データが数分、数時間、またはそれ以上流れるようにHTTPストリームを開いて座っているほど簡単ではありません。クライアントが異なると動作も異なり、管理する必要があります。たとえば、一部のクライアントはデータをバッファに格納し、しきい値に達するまでアプリケーションにリリースしません。さらに悪いことに、一部は接続が閉じられるまでアプリケーションにデータを渡さないでしょう。
したがって、複数のメッセージをクライアントに送信する場合、たとえば、50メッセージ分のデータが受信されるまで、クライアントアプリケーションがデータを受信しない可能性があります。それはあまりにもリアルタイムではありません。
HTTPストリーミングは、WebSocketが利用できない場合の実行可能な代替手段となり得ますが、万能薬ではありません。現実世界の状況でWebの荒れ地で確実に機能するためには、十分な理解が必要です。
私が見逃している他の重要な違いはありますか?
まだ誰も言及していないことがもう1つあるので、それを取り上げます。
WebSocketプロトコルは、上位レベルのプロトコルのトランスポート層になるように設計されました。WebSocket接続を介してJSONメッセージなどを直接送信できますが、標準またはカスタムのプロトコルを伝送することもできます。
たとえば、人々が既に行っているように、WebSocket経由でAMQPまたはXMPPを実行できます。したがって、クライアントは、ブローカー自体に直接接続されているかのように(場合によっては接続されている)、AMQPブローカーからメッセージを受信できます。
または、カスタムプロトコルを備えた既存のサーバーがある場合は、それをWebSocket経由で転送して、そのバックエンドサーバーをWebに拡張できます。多くの場合、企業内でロックされている既存のアプリケーションは、バックエンドインフラストラクチャを変更することなく、WebSocketを使用してその範囲を広げることができます。
(当然、すべてを安全に実行できるようにしたいので、ベンダーまたはWebSocketプロバイダーに確認してください。)
一部の人々はWebSocketをWebのTCPと呼んでいます。TCPが上位レベルのプロトコルを転送するのと同じように、WebSocketも転送するため、Webインフラストラクチャと互換性があります。
したがって、JSON(またはその他の)メッセージをWebSocket経由で直接送信することは常に可能ですが、既存のプロトコルも検討する必要があります。あなたがしたいことがたくさんあるので、おそらくそれをするためにすでに考えられているプロトコルがあるでしょう。
既にSOに関する質問の多くを1つの質問に再質問または組み合わせている場合は申し訳ありませんが、これらの概念に関してSOおよびWebにあるすべての情報から完全に理解したいと思います。
これは素晴らしい質問でした、そして答えはすべて非常に有益でした!