Einige großartige Antworten von anderen, die viel Boden abdecken. Hier ist ein bisschen mehr.
Der einzige Vorteil von WebSockets gegenüber Plugins wie Java Applets, Flash oder Silverlight besteht darin, dass WebSockets nativ in Browser integriert sind und nicht auf Plugins basieren.
Wenn Sie damit meinen, dass Sie Java Applets, Flash oder Silverlight verwenden können, um eine Socket-Verbindung herzustellen, ist dies möglich. Aufgrund der Einschränkungen wird dies jedoch nicht allzu oft in der realen Welt eingesetzt.
Zum Beispiel können und tun Vermittler diesen Verkehr herunterfahren. Der WebSocket-Standard wurde so konzipiert, dass er mit der vorhandenen HTTP-Infrastruktur kompatibel ist, und ist daher weitaus weniger anfällig für Störungen durch Vermittler wie Firewalls und Proxys.
Darüber hinaus kann WebSocket die Ports 80 und 443 verwenden, ohne dass dedizierte Ports erforderlich sind. Dies ist wiederum auf das Protokolldesign zurückzuführen, das so kompatibel wie möglich mit der vorhandenen HTTP-Infrastruktur ist.
Diese Socket-Alternativen (Java, Flash und Silverlight) sind in einer Ursprungsarchitektur nur schwer sicher zu verwenden. Daher tolerieren Menschen, die häufig versuchen, sie Cross-Origin zu verwenden, die Unsicherheiten, anstatt sich die Mühe zu machen, dies sicher zu tun.
Sie können auch das Öffnen zusätzlicher "nicht standardmäßiger" Ports (etwas, was Administratoren nicht tun möchten) oder von Richtliniendateien erfordern, die verwaltet werden müssen.
Kurz gesagt, die Verwendung von Java, Flash oder Silverlight für die Socket-Konnektivität ist problematisch genug, sodass Sie nicht feststellen, dass es in ernsthaften Architekturen zu oft bereitgestellt wird. Flash und Java haben diese Fähigkeit wahrscheinlich seit mindestens 10 Jahren und sind dennoch nicht weit verbreitet.
Der WebSocket-Standard konnte mit einem neuen Ansatz beginnen, der diese Einschränkungen berücksichtigt und hoffentlich einige Lehren daraus gezogen hat.
Einige WebSocket-Implementierungen verwenden Flash (oder möglicherweise Silverlight und / oder Java) als Fallback, wenn keine WebSocket-Konnektivität hergestellt werden kann (z. B. wenn sie in einem alten Browser ausgeführt werden oder wenn ein Vermittler eingreift).
Während eine Art Fallback-Strategie für diese Situationen klug und sogar notwendig ist, leiden die meisten, die Flash et al. Verwenden, unter den oben beschriebenen Nachteilen. Das muss nicht so sein - es gibt Problemumgehungen, um sichere Cross-Origin-fähige Verbindungen mit Flash, Silverlight usw. herzustellen -, aber die meisten Implementierungen tun dies nicht, weil es nicht einfach ist.
Wenn Sie sich beispielsweise für eine Cross-Origin-Verbindung auf WebSocket verlassen, funktioniert dies einwandfrei. Wenn Sie dann jedoch in einem alten Browser oder einer gestörten Firewall / einem gestörten Proxy ausgeführt werden und sich beispielsweise auf Flash als Fallback verlassen, fällt es Ihnen schwer, dieselbe Ursprungsverbindung herzustellen. Es sei denn, Sie kümmern sich natürlich nicht um Sicherheit.
Das bedeutet, dass es schwierig ist, eine einzige einheitliche Architektur zu haben, die für native und nicht native Verbindungen funktioniert, es sei denn, Sie sind bereit, einiges an Arbeit zu leisten oder sich für ein Framework zu entscheiden, das dies gut gemacht hat. In einer idealen Architektur würden Sie nicht bemerken, ob die Verbindungen nativ waren oder nicht; Ihre Sicherheitseinstellungen würden in beiden Fällen funktionieren. Ihre Clustering-Einstellungen würden weiterhin funktionieren. Ihre Kapazitätsplanung würde noch halten; und so weiter.
Der einzige Vorteil von WebSockets gegenüber http-Streaming besteht darin, dass Sie sich nicht bemühen müssen, die empfangenen Daten zu "verstehen" und zu analysieren.
Es ist nicht so einfach, einen HTTP-Stream zu öffnen und sich zurückzulehnen, während Ihre Daten Minuten, Stunden oder länger fließen. Unterschiedliche Kunden verhalten sich unterschiedlich und das müssen Sie verwalten. Beispielsweise puffern einige Clients die Daten und geben sie erst dann an die Anwendung weiter, wenn ein bestimmter Schwellenwert erreicht ist. Schlimmer noch, einige geben die Daten erst an die Anwendung weiter, wenn die Verbindung geschlossen ist.
Wenn Sie also mehrere Nachrichten an den Client senden, wird die Clientanwendung die Daten möglicherweise erst empfangen, wenn beispielsweise Daten im Wert von 50 Nachrichten empfangen wurden. Das ist nicht zu Echtzeit.
Während HTTP-Streaming eine praktikable Alternative sein kann, wenn WebSocket nicht verfügbar ist, ist es kein Allheilmittel. Es braucht ein gutes Verständnis, um unter realen Bedingungen auf robuste Weise im Ödland des Web zu arbeiten.
Gibt es noch andere signifikante Unterschiede, die mir fehlen?
Es gibt noch eine andere Sache, die noch niemand erwähnt hat, also werde ich sie ansprechen.
Das WebSocket-Protokoll wurde als Transportschicht für übergeordnete Protokolle konzipiert. Sie können JSON-Nachrichten oder was nicht direkt über eine WebSocket-Verbindung senden, es können jedoch auch Standard- oder benutzerdefinierte Protokolle übertragen werden.
Sie können beispielsweise AMQP oder XMPP über WebSocket ausführen, wie dies bereits geschehen ist. Ein Client kann also Nachrichten von einem AMQP-Broker empfangen, als wäre er direkt mit dem Broker selbst verbunden (und in einigen Fällen auch).
Wenn Sie über einen vorhandenen Server mit einem benutzerdefinierten Protokoll verfügen, können Sie diesen über WebSocket transportieren und so diesen Back-End-Server auf das Web ausweiten. Häufig kann eine vorhandene Anwendung, die im Unternehmen gesperrt wurde, ihre Reichweite mithilfe von WebSocket erweitern, ohne dass die Back-End-Infrastruktur geändert werden muss.
(Natürlich möchten Sie dies alles sicher tun können. Wenden Sie sich daher an den Anbieter oder den WebSocket-Anbieter.)
Einige Leute haben WebSocket als TCP für das Web bezeichnet. Denn genau wie TCP übergeordnete Protokolle transportiert, überträgt auch WebSocket Protokolle, die jedoch mit der Webinfrastruktur kompatibel sind.
Während das Senden von JSON-Nachrichten (oder was auch immer) direkt über WebSocket immer möglich ist, sollten auch vorhandene Protokolle berücksichtigt werden. Denn für viele Dinge, die Sie tun möchten, gibt es wahrscheinlich ein Protokoll, an das bereits gedacht wurde.
Es tut mir leid, wenn ich viele der bereits auf SO vorhandenen Fragen erneut stelle oder zu einer einzigen Frage kombiniere, aber ich möchte nur aus all den Informationen, die auf SO und im Internet zu diesen Konzepten verfügbar sind, einen vollkommenen Sinn machen.
Dies war eine großartige Frage, und die Antworten waren alle sehr informativ!