Каковы различия между socket.io и websockets в node.js?
Они обе - серверные технологии? Единственные различия, которые я чувствовал, были,
socket.io позволял мне отправлять / отправлять сообщения, указав имя события.
В случае socket.io сообщение от сервера будет поступать на все клиенты, но для того же самого в веб-сокетах я был вынужден хранить массив всех соединений и проходить через него для отправки сообщений всем клиентам.
Кроме того, мне интересно, почему веб-инспекторы (такие как Chrome / firebug / fiddler) не могут перехватить эти сообщения (из socket.io/websocket) с сервера?
Пожалуйста, уточните это.
Ответы:
Его преимущества заключаются в том, что он упрощает использование WebSockets, как вы описали в # 2, и, возможно, что более важно, он обеспечивает отработки отказа для других протоколов в случае, если WebSockets не поддерживаются в браузере или на сервере. Я бы не стал использовать WebSockets напрямую, если вы не очень хорошо знаете, в каких средах они не работают, и не способны обойти эти ограничения.
Это хорошее чтение как для WebSockets, так и для Socket.IO.
http://davidwalsh.name/websocket
источник
заблуждения
Существует несколько распространенных заблуждений относительно WebSocket и Socket.IO:
Первое заблуждение заключается в том, что использовать Socket.IO значительно проще, чем использовать WebSocket, что, похоже, не так. Смотрите примеры ниже.
Второе заблуждение заключается в том, что WebSocket не широко поддерживается в браузерах. Смотрите ниже для получения дополнительной информации.
Третье заблуждение заключается в том, что Socket.IO снижает версию соединения как запасной вариант в старых браузерах. Фактически предполагается, что браузер устарел и устанавливает AJAX-соединение с сервером, которое впоследствии обновляется в браузерах, поддерживающих WebSocket, после обмена некоторым трафиком. Смотрите ниже для деталей.
Мой эксперимент
Я написал модуль npm, чтобы продемонстрировать разницу между WebSocket и Socket.IO:
Это простой пример кода на стороне сервера и на стороне клиента: клиент подключается к серверу с помощью WebSocket или Socket.IO, а сервер отправляет три сообщения с интервалом в 1 с, которые клиент добавляет в DOM.
Серверный
Сравните пример использования WebSocket и Socket.IO на стороне сервера, чтобы сделать то же самое в приложении Express.js:
WebSocket Server
Пример сервера WebSocket с использованием Express.js:
Источник: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.js
Сервер Socket.IO
Пример сервера Socket.IO с использованием Express.js:
Источник: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.js
Сторона клиента
Сравните пример использования WebSocket и Socket.IO на стороне клиента, чтобы сделать то же самое в браузере:
Клиент WebSocket
Пример клиента WebSocket с использованием ванильного JavaScript:
Источник: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.html
Клиент Socket.IO
Пример клиента Socket.IO с использованием ванильного JavaScript:
Источник: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.html
Сетевой трафик
Чтобы увидеть разницу в сетевом трафике вы можете запустить мой тест . Вот результаты, которые я получил:
Результаты WebSocket
2 запроса, 1,50 КБ, 0,05 с
Из этих 2 запросов:
(Запрос на обновление соединения отображается в инструментах разработчика с ответом 101 Switching Protocols.)
Результаты Socket.IO
6 запросов, 181,56 КБ, 0,25 с
Из этих 6 запросов:
Скриншоты
Результаты WebSocket, которые я получил на localhost:
Результаты Socket.IO, которые я получил на localhost:
Проверь себя
Быстрый старт:
Откройте http: // localhost: 3001 / в браузере, откройте инструменты разработчика с помощью Shift + Ctrl + I, откройте вкладку Сеть и перезагрузите страницу с помощью Ctrl + R, чтобы увидеть сетевой трафик для версии WebSocket.
Откройте http: // localhost: 3002 / в браузере, откройте инструменты разработчика с помощью Shift + Ctrl + I, откройте вкладку Сеть и перезагрузите страницу с помощью Ctrl + R, чтобы увидеть сетевой трафик для версии Socket.IO.
Чтобы удалить:
Совместимость браузера
По состоянию на июнь 2016 года WebSocket работает на всем, кроме Opera Mini, включая IE выше 9.
Это совместимость браузера с WebSocket на « Могу ли я использовать» по состоянию на июнь 2016 года:
Смотрите http://caniuse.com/websockets для получения актуальной информации.
источник
Я собираюсь предоставить аргумент против использования socket.io.
Я думаю, что использование socket.io исключительно потому, что у него есть запасные варианты, не очень хорошая идея. Пусть IE8 RIP.
В прошлом было много случаев, когда новые версии NodeJS ломали socket.io. Вы можете проверить эти списки для примеров ... https://github.com/socketio/socket.io/issues?q=install+error
Если вы собираетесь разрабатывать приложение для Android или что-то, что должно работать с вашим существующим приложением, вам, вероятно, будет хорошо работать с WS прямо сейчас, socket.io может дать вам некоторые проблемы ...
Плюс модуль WS для Node.JS удивительно прост в использовании.
источник
Использование Socket.IO в основном похоже на использование jQuery - вы хотите поддерживать более старые браузеры, вам нужно писать меньше кода, а библиотека обеспечит запасные варианты. Socket.io использует технологию веб-сокетов, если она доступна, а если нет, проверяет наилучший доступный тип связи и использует ее.
источник
Даже если современные браузеры теперь поддерживают WebSockets, я думаю, что нет необходимости выбрасывать SocketIO, и он по-прежнему имеет свое место в любом современном проекте. Это легко понять, и лично я узнал, как работают WebSockets благодаря SocketIO.
Как уже говорилось в этом разделе, существует множество библиотек интеграции для Angular, React и т. Д. И типов определений для TypeScript и других языков программирования.
Еще один момент, который я хотел бы добавить к различиям между Socket.io и WebSockets, заключается в том, что кластеризация с Socket.io не имеет большого значения. Socket.io предлагает адаптеры, которые можно использовать для связи с Redis для повышения масштабируемости. Например, у вас есть ioredis и socket.io-redis .
Да, я знаю, SocketCluster существует, но это не по теме.
источник
Socket.IO использует WebSocket, а когда WebSocket недоступен, используется альтернативный алгоритм для создания соединений в реальном времени.
источник
https://socket.io/docs/#What-Socket-IO-is-not (с моим акцентом )
источник