Какую библиотеку веб-сокетов использовать с Node.js? [закрыто]

428

В настоящее время существует множество библиотек websocket для node.js, наиболее популярными из которых являются:

Однако я не могу найти никаких конкретных сопоставлений между ними ... Судя по всему, Socket.io был потрясающим, но он устарел и имел неудачные сборки. И ws, и websocket-node утверждают, что они самые быстрые. И engine.io кажется новым, но намного тяжелее легких.

Было бы удивительно, если бы мы или кто-то могли составить ответ, который послужит руководством по выбору библиотеки сокетов и когда, а также сравнением между ними.

balupton
источник
246
Если это закрыто, куда должен идти такой вопрос? Поскольку ответ будет невероятно полезным ... Кажется, к сожалению, такой важный вопрос не должен находиться здесь.
Балуптон
14
Woot woot для вики сообщества, то есть, несмотря на то, что вопрос закрыт из новых ответов, мы все еще можем улучшить ответ вики сообщества ниже :)
balupton
14
Я согласен, я хотел бы, чтобы такой вопрос не только разрешался, но и поощрялся. Хорошо, они могут быть неактуальными через годы, но до тех пор они спасут мир.
Джон Литтл
1
@balupton, можешь ли ты обновить сообщество своим выбором и доволен ли ты этим? это socket.io?
C графика
3
@Cgraphics В настоящее время я использую Primus с ws, так как ws - это все, что мне нужно, если мне нужно что-то более экстремальное, я просто заменяю базовую библиотеку и сохраняю то же самое API благодаря Primus. Творит чудеса.
Балуптон

Ответы:

390

Получение ответа от этого вики-сообщества . Не стесняйтесь редактировать меня с вашими улучшениями.

  • ws сервер и клиент WebSocket для node.js. Одна из самых быстрых библиотек, если не самая быстрая.

  • WebSocket-узел WebSocket-сервер и клиент для node.js

  • websocket-driver-node Сервер WebSocket и анализатор клиентских протоколов node.js - используется в faye-websocket-node

  • Сервер и клиент WebSocket для faye-websocket-node для node.js - используется в faye и sockjs

  • сервер socket.io WebSocket и клиент для node.js + клиент для браузеров + (v0 имеет самые новые и старые резервные версии, v1 Socket.io использует engine.io) + каналы - используется в stack.io. Клиентская библиотека пытается восстановить соединение при отключении.

  • Сервер sockjs WebSocket и клиент для node.js и другие + клиент для браузеров + новейшие и старые резервные версии

  • сервер и клиент faye WebSocket для node.js и др. + клиент для браузеров + резервные копии + поддержка других серверных языков

  • кластерный сервер в реальном времени deepstream.io, который обрабатывает соединения WebSockets & TCP и обеспечивает синхронизацию данных, публикацию / подписку и запрос / ответ

  • кластер серверов socketcluster WebSocket, который использует все ядра процессора на вашей машине. Например, если бы вы использовали большой экземпляр Amazon EC2 с 32 ядрами, вы могли бы обрабатывать почти 32-кратный трафик за один экземпляр.

  • primus Предоставляет общий API для большинства библиотек, указанных выше, для простого переключения + улучшения стабильности для всех из них.

Когда использовать:

  • используйте базовые серверы WebSocket, если вы хотите использовать собственные реализации WebSocket на стороне клиента, остерегайтесь несовместимости браузера

  • используйте резервные библиотеки, когда вы заботитесь о резервных браузерах

  • использовать полнофункциональные библиотеки, когда вы заботитесь о каналах

  • используйте primus, когда вы не знаете, что использовать, у вас нет настроения переписывать ваше приложение, когда вам нужно переключить фреймворки из-за изменяющихся требований проекта или вам нужна дополнительная стабильность соединения.

Где проверить:

Firecamp - это среда тестирования графического интерфейса для SocketIO, WS и всех основных технологий реального времени. Отлаживайте события в реальном времени, пока вы разрабатываете.

балуптон
источник
10
Спасибо за подробный ответ. Можете ли вы объяснить пункт 3, когда использовать. На какие каналы ссылается точка? Я новичок в веб-сокетах и ​​пытаюсь понять, какой использовать в моем случае.
Акшат Дживан Шарма
2
А как насчет автобана / WAMP?
Эмиль Кормир
1
Хороший список всех доступных вариантов после смерти now.js
Рахул Прасад
@AkshatJiwanSharma: Каналы - это так называемые «комнаты», которыми каждый игрок в комнате может обмениваться сообщениями.
Марвен Трабелси,
4
Небольшая деталь для ws - это то, что ему нужен python. Поэтому, если вы развертываете в Docker-контейнерах или чем-то еще, вам нужно иметь Python для использования ws.
AntouanK
40

Обновление: этот ответ устарел, поскольку с тех пор выпускаются более новые версии упомянутых библиотек.

Socket.IO v0.9 устарел и немного глючит, а Engine.IO является временным преемником. Socket.IO v1.0 (который будет выпущен в ближайшее время) будет использовать Engine.IO и будет намного лучше, чем v0.9. Я бы порекомендовал вам использовать Engine.IO до выхода Socket.IO v1.0.

«ws» не поддерживает резервирование, поэтому, если клиентский браузер не поддерживает веб-сокеты, он не будет работать, в отличие от Socket.IO и Engine.IO, которые используют длинные опросы и т. д., если веб-сокеты недоступны. Тем не менее, «ws» кажется самой быстрой библиотекой на данный момент.

Смотрите мою статью по сравнению Socket.IO, Engine.IO и Primus: https://medium.com/p/b63bfca0539

Дениз Озгер
источник
Это напоминает мне о обычном Node.js 0.12, немедленном ... они также утверждают, что уже несколько месяцев. Так что, наверное, нам придется подождать и посмотреть…
Голо Роден
1
Есть ли у вас какие-либо идеи / опыт работы с Autobahn / WAMP ( wamp.ws )?
Эмиль Кормиер
6
Socket.IO выпустила свою версию v1. Engine.io не является его заменой, но используется внутри Socket.IO в качестве транспортного протокола - он абстрагирует фактическую связь между конечными точками (xhr, ws) и имеет простой формат для пакетов. Socket.io предоставляет более богатый API, который «чувствует» себя как источник событий по проводам.
Хамметт
29

Npm WS был ответом для меня. Я нашел это менее навязчивым и более прямым. С этим было также тривиально смешивать веб-сокеты с сервисами отдыха. Поделился простым кодом на этот пост.

var WebSocketServer = require("ws").Server;
var http = require("http");
var express = require("express");
var port = process.env.PORT || 5000;

var app = express();
    app.use(express.static(__dirname+ "/../"));
    app.get('/someGetRequest', function(req, res, next) {
       console.log('receiving get request');
    });
    app.post('/somePostRequest', function(req, res, next) {
       console.log('receiving post request');
    });
    app.listen(80); //port 80 need to run as root

    console.log("app listening on %d ", 80);

var server = http.createServer(app);
    server.listen(port);

console.log("http server listening on %d", port);

var userId;
var wss = new WebSocketServer({server: server});
    wss.on("connection", function (ws) {

    console.info("websocket connection open");

    var timestamp = new Date().getTime();
    userId = timestamp;

    ws.send(JSON.stringify({msgType:"onOpenConnection", msg:{connectionId:timestamp}}));


    ws.on("message", function (data, flags) {
        console.log("websocket received a message");
        var clientMsg = data;

        ws.send(JSON.stringify({msg:{connectionId:userId}}));


    });

    ws.on("close", function () {
        console.log("websocket connection close");
    });
});
console.log("websocket server created");
MFAL
источник
Как получить URL запроса в методе подключения? wss.on («соединение», функция (ws) {// некоторый код console.log (ws. ???) get url ...}
Opalosolo
URL запроса не существует, как в запросах ajax. Библиотека javascript открывает соединение с вашим сервером веб-сокетов, используя адрес 127.0.0.1:8080 или что-нибудь.com:7777 и т. Д. Это звучит странно, попробуйте пройти через несколько простых уроков по веб-сокетам.
MFAL
5
На самом деле конечные точки WebSocket также имеют URL, с которых они начинаются ws, например ws://myserver.com. И да, они могут быть настроены для обслуживания с использованием портов 80 и 443. Используя обратный прокси-сервер, такой как nginx, вы можете WebSocketперенаправить URL-адреса протоколов на другой порт из обычных протоколов HTTP.
Прахлад Ери
Вы можете моделировать маршруты, если хотите.
Лукас Теттаманти
1
Использование express-wsпозволяет добавлять wsмаршруты в экспресс-приложении.
Дмитрий Масли