Какую библиотеку websocket использовать с Node.js?

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

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

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

Ответ 1

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

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

  • websocket-node Сервер и клиент WebSocket для node.js

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

  • faye-websocket-node Сервер и клиент WebSocket для 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-соединения и обеспечивает синхронизацию данных, pub/sub и запрос/ответ

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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");