Деякі чудові відповіді від інших, які накривають багато підстав. Ось трохи зайвого.
Єдина перевага WebSockets над плагінами, такими як Java Applets, Flash або Silverlight, полягає в тому, що WebSockets вбудовані в браузери і не покладаються на плагіни.
Якщо під цим ви маєте на увазі, що ви можете використовувати Java Applets, Flash або Silverlight для встановлення з'єднання з сокетом, то так, це можливо. Однак ви не бачите цього в реальному світі занадто часто через обмеження.
Наприклад, посередники можуть і зупинити цей трафік. Стандарт WebSocket був розроблений таким чином, щоб бути сумісним з існуючою HTTP-інфраструктурою, і тому він набагато менш схильний до втручання з боку посередників, таких як брандмауері та проксі-сервери.
Більше того, WebSocket може використовувати порт 80 і 443, не вимагаючи виділених портів, знову ж таки завдяки дизайну протоколу бути максимально сумісним з існуючою HTTP-інфраструктурою.
Ці альтернативні розетки (Java, Flash та Silverlight) важко безпечно використовувати в архітектурі перехресного походження. Таким чином, люди, які часто намагаються використовувати їх перехресне походження, будуть терпіти невпевненість, а не намагатися робити це безпечно.
Вони також можуть вимагати відкриття додаткових "нестандартних" портів (те, що адміністратори ненавидять робити) або файлів політики, якими потрібно керувати.
Коротше кажучи, використовувати Java, Flash або Silverlight для підключення сокет досить проблематично, що ви не бачите його занадто часто розгорнутим у серйозних архітектурах. Flash та Java мали цю здатність, мабуть, принаймні 10 років, і все ж це не є поширеним.
Стандарт WebSocket міг почати із нового підходу, маючи на увазі ці обмеження, і, сподіваємось, навчився з них деякі уроки.
Деякі реалізації WebSocket використовують Flash (або, можливо, Silverlight та / або Java) як резервну копію, коли підключення до WebSocket неможливо встановити (наприклад, при запуску в старому браузері або коли втручається посередник).
Хоча якась стратегія резервного копіювання для цих ситуацій розумна, навіть необхідна, більшість тих, хто використовує Flash et al, будуть страждати від описаних вище недоліків. Це не повинно бути таким чином - існують шляхи вирішення способів досягнення безпечних з'єднань, здатних до перехресного походження, використовуючи Flash, Silverlight тощо.
Наприклад, якщо ви покладаєтесь на WebSocket для перехресного походження, це буде добре. Але якщо ви запускаєте старий веб-переглядач або втручаєтеся брандмауер / проксі і покладаєтесь на Flash, скажімо, як ваш резервний запас, вам буде складно виконати те саме підключення між походженнями. Якщо, звичайно, ви не дбаєте про безпеку.
Це означає, що складно створити єдину об'єднану архітектуру, яка працює для рідних і не рідних зв’язків, якщо тільки ви не готові вкласти чимало роботи або не виконати рамки, які це зробили добре. В ідеальній архітектурі ви не помітили б, чи з'єднання були рідними чи ні; ваші налаштування безпеки будуть працювати в обох випадках; ваші налаштування кластеризації все одно будуть працювати; ваше планування потенціалу все ще буде дотримано; і так далі.
Єдина перевага WebSockets над потоком http полягає в тому, що вам не доведеться докладати зусиль, щоб "зрозуміти" та проаналізувати отримані дані.
Це не так просто, як відкривати потік HTTP і сидіти, коли ваші дані протікають хвилин, годин або довше. Різні клієнти поводяться по-різному, і ви повинні цим керувати. Наприклад, деякі клієнти завантажують дані в буфер і не передають їх у додаток, поки не буде досягнуто певного порогу. Ще гірше, що деякі не передадуть дані програмі, поки з'єднання не буде закрито.
Отже, якщо ви надсилаєте декілька повідомлень до клієнта, можливо, клієнтська програма не отримає дані, доки, наприклад, не буде отримано 50 повідомлень на суму. Це не надто в режимі реального часу.
Хоча потокове передавання HTTP може бути життєздатною альтернативою, коли WebSocket недоступний, це не панацея. Потрібно добре розуміння, щоб надійно працювати в неплотних місцях Мережі в реальних умовах.
Чи є якісь інші суттєві відмінності, які мені не вистачає?
Є ще одна річ, про яку ще ніхто не згадував, тому я підведу це.
Протокол WebSocket був розроблений як транспортний рівень для протоколів вищого рівня. Хоча ви можете надсилати повідомлення JSON чи що інше безпосередньо через з'єднання WebSocket, воно також може переносити стандартні або спеціальні протоколи.
Наприклад, ви можете робити AMQP або XMPP через WebSocket, як це вже робили люди. Таким чином клієнт міг отримувати повідомлення від брокера AMQP так, ніби він був підключений безпосередньо до самого брокера (а в деяких випадках і є).
Або якщо у вас є існуючий сервер з певним користувальницьким протоколом, ви можете транспортувати його через WebSocket, тим самим поширивши цей бек-сервер в Інтернет. Часто наявна програма, що була заблокована на підприємстві, може розширити сферу її дії за допомогою WebSocket, не змінюючи жодної інфраструктури.
(Зрозуміло, ви хочете мати можливість зробити все це надійно, тому зверніться до постачальника чи постачальника WebSocket.)
Деякі люди називають WebSocket як TCP для Інтернету. Тому що, як і TCP транспортує протоколи вищого рівня, так і WebSocket, але таким чином, що він сумісний з веб-інфраструктурою.
Тож хоча відправлення JSON (або будь-яких інших) повідомлень безпосередньо через WebSocket завжди можливе, слід також враховувати існуючі протоколи. Тому що для багатьох речей, які ви хочете зробити, мабуть, існує протокол, про який вже думали зробити це.
Вибачте, якщо я перепитую або поєдную багато запитань, які вже існують на ЗП, в одне запитання, але я просто хочу отримати ідеальний сенс з усієї інформації, яка там знаходиться в СО та Інтернеті щодо цих понять.
Це було чудове запитання, і всі відповіді були дуже інформативними!