Kilka świetnych odpowiedzi od innych, które obejmują wiele zagadnień. Oto trochę więcej.
Jedyną zaletą WebSockets w porównaniu z wtyczkami, takimi jak aplety Java, Flash czy Silverlight jest to, że WebSockets są natywnie wbudowane w przeglądarki i nie polegają na wtyczkach.
Jeśli przez to masz na myśli, że możesz użyć apletów Java, Flash lub Silverlight do ustanowienia połączenia przez gniazdo, to tak, to jest możliwe. Jednak nie widzisz tego zbyt często w prawdziwym świecie ze względu na ograniczenia.
Na przykład pośrednicy mogą i wyłączają ten ruch. Standard WebSocket został zaprojektowany tak, aby był kompatybilny z istniejącą infrastrukturą HTTP, dzięki czemu jest znacznie mniej podatny na ingerencję pośredników, takich jak zapory i serwery proxy.
Co więcej, WebSocket może używać portów 80 i 443 bez konieczności stosowania dedykowanych portów, również dzięki projektowi protokołu, który jest możliwie jak najbardziej kompatybilny z istniejącą infrastrukturą HTTP.
Te alternatywy gniazd (Java, Flash i Silverlight) są trudne w bezpiecznym użyciu w architekturze między źródłami. Dlatego ludzie, którzy często próbują ich używać w różnych miejscach, będą tolerować niepewność, zamiast podejmować wysiłki, aby robić to bezpiecznie.
Mogą również wymagać otwarcia dodatkowych „niestandardowych” portów (coś, czego administratorzy nie lubią robić) lub plików zasad, którymi trzeba zarządzać.
Krótko mówiąc, używanie Java, Flash lub Silverlight do łączenia się z gniazdami jest na tyle problematyczne, że nie widać go zbyt często w poważnych architekturach. Flash i Java mają taką możliwość od prawdopodobnie co najmniej 10 lat, a jednak nie są one powszechne.
Standard WebSocket mógł zacząć od nowego podejścia, mając na uwadze te ograniczenia i miejmy nadzieję, że wyciągnął z nich pewne wnioski.
Niektóre implementacje WebSocket używają Flasha (lub prawdopodobnie Silverlight i / lub Java) jako rozwiązania zastępczego, gdy nie można ustanowić łączności WebSocket (na przykład podczas uruchamiania w starej przeglądarce lub gdy przeszkadza pośrednik).
Chociaż jakaś strategia awaryjna w takich sytuacjach jest sprytna, a nawet konieczna, większość tych, którzy używają Flasha i innych, będzie cierpieć z powodu opisanych powyżej wad. Nie musi tak być - istnieją obejścia umożliwiające uzyskanie bezpiecznych połączeń obsługujących różne źródła przy użyciu Flash, Silverlight itp. - ale większość implementacji tego nie zrobi, ponieważ nie jest to łatwe.
Na przykład, jeśli polegasz na protokole WebSocket jako połączenia między źródłami, to zadziała dobrze. Ale jeśli następnie uruchomisz w starej przeglądarce lub włączysz zaporę ogniową / serwer proxy i polegasz na Flash, powiedzmy, jako rozwiązaniu awaryjnym, trudno będzie ci wykonać to samo połączenie między źródłami. Chyba że nie zależy ci na bezpieczeństwie, oczywiście.
Oznacza to, że trudno jest mieć jedną zunifikowaną architekturę, która działa dla połączeń natywnych i obcych, chyba że jesteś przygotowany na włożenie sporo pracy lub skorzystanie z frameworka, który dobrze to zrobił. W idealnej architekturze nie zauważyłbyś, czy połączenia były natywne, czy nie; Twoje ustawienia bezpieczeństwa będą działać w obu przypadkach; Twoje ustawienia klastrowania nadal będą działać; twoje planowanie zdolności nadal by się utrzymało; i tak dalej.
Jedyną zaletą WebSockets w porównaniu do przesyłania strumieniowego HTTP jest to, że nie trzeba się wysilać, aby „zrozumieć” i przeanalizować otrzymane dane.
Nie jest to tak proste, jak otwarcie strumienia HTTP i zatrzymanie się podczas przepływu danych przez minuty, godziny lub dłużej. Różni klienci zachowują się inaczej i musisz sobie z tym poradzić. Na przykład niektórzy klienci będą buforować dane i nie udostępniać ich do aplikacji, dopóki nie zostanie osiągnięty pewien próg. Co gorsza, niektórzy nie przekazują danych do aplikacji, dopóki połączenie nie zostanie zamknięte.
Więc jeśli wysyłasz wiele wiadomości do klienta, możliwe jest, że aplikacja kliencka nie otrzyma danych, dopóki na przykład nie otrzyma danych o wartości 50 wiadomości. To nie jest zbyt w czasie rzeczywistym.
Chociaż przesyłanie strumieniowe HTTP może być realną alternatywą, gdy protokół WebSocket nie jest dostępny, nie jest to panaceum. Wymaga dobrego zrozumienia, aby działać w sposób niezawodny na pustkowiach sieci w rzeczywistych warunkach.
Czy są jakieś inne istotne różnice, których mi brakuje?
Jest jeszcze jedna rzecz, o której nikt jeszcze nie wspomniał, więc poruszę to.
Protokół WebSocket został zaprojektowany jako warstwa transportowa dla protokołów wyższego poziomu. Chociaż możesz wysyłać wiadomości JSON lub inne rzeczy bezpośrednio przez połączenie WebSocket, może również przenosić standardowe lub niestandardowe protokoły.
Na przykład możesz zrobić AMQP lub XMPP przez WebSocket, tak jak ludzie już to zrobili. Tak więc klient może odbierać komunikaty od brokera AMQP, tak jakby był bezpośrednio połączony z samym brokerem (aw niektórych przypadkach tak jest).
Lub jeśli masz istniejący serwer z jakimś niestandardowym protokołem, możesz przetransportować go przez WebSocket, rozszerzając w ten sposób ten serwer zaplecza na Internet. Często istniejąca aplikacja, która została zablokowana w przedsiębiorstwie, może rozszerzyć swój zasięg za pomocą WebSocket, bez konieczności zmiany jakiejkolwiek infrastruktury zaplecza.
(Oczywiście chciałbyś móc to wszystko zrobić bezpiecznie, więc skontaktuj się z dostawcą lub dostawcą WebSocket).
Niektórzy określają WebSocket jako TCP dla sieci Web. Ponieważ tak jak TCP transportuje protokoły wyższego poziomu, tak samo jest z WebSocket, ale w sposób zgodny z infrastrukturą sieci Web.
Więc podczas gdy wysyłanie wiadomości JSON (lub cokolwiek innego) bezpośrednio przez WebSocket jest zawsze możliwe, należy również wziąć pod uwagę istniejące protokoły. Ponieważ w przypadku wielu rzeczy, które chcesz zrobić, prawdopodobnie został już wymyślony protokół, aby to zrobić.
Przepraszam, jeśli ponownie zadaję lub łączę wiele pytań już na SO w jedno pytanie, ale chcę po prostu nadać doskonały sens wszystkim informacjom, które są dostępne w SO i sieci, dotyczące tych koncepcji.
To było świetne pytanie, a wszystkie odpowiedzi były bardzo pouczające!