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


428

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

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

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


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

Как получить 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маршруты в экспресс-приложении.
— Дмитрий Масли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.