Яку бібліотеку веб-сокетів використовувати для Node.js? [зачинено]


429

В даний час існує безліч бібліотек веб-сокетів для node.js, найпопулярнішими, здається, є:

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

Було б дивовижно, якби ми чи хтось міг скласти відповідь, яка служить керівництвом щодо того, яку бібліотеку сокетів використовувати і коли, а також порівняння між ними.


246
Якщо це закривається, куди слід поділитися таким питанням? Оскільки відповідь буде неймовірно корисною ... Здається, прикро, що таке важливе питання не повинно перебувати тут.
балуптон

14
Woot Woot для вікі спільноти, тобто, незважаючи на те, що питання закрите від нових відповідей, ми все ще можемо покращити відповідь вікі спільноти нижче :)
balupton

14
Я погоджуюсь, я хотів би, щоб таке питання не просто було дозволене, а заохочене. Гаразд, вони можуть не бути актуальними через роки, але до цього вони врятують світ.
Джон Маленький

1
@balupton Ви можете оновити спільноту за своїм вибором, і якщо ви задоволені цим? це socket.io?
C графіка

3
@Cgraphics Я використовую Primus з ws в наші дні, оскільки w - це все, що мені потрібно, якщо мені потрібно щось більш екстремальне, я просто поміняю бібліотеку, що зберігається, і зберігаю ті самі api завдяки Primus. Творить чудеса.
balupton

Відповіді:


390

Здійснення прокатки м'яча за допомогою відповіді у вікі спільноти . Не соромтеся редагувати мене з вашими вдосконаленнями.

  • ws WebSocket сервер і клієнт для node.js. Одна з найшвидших бібліотек, якщо не найшвидша.

  • websocket-вузол 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, який використовує всі ядра CPU на вашій машині. Наприклад, якби ви використовували екземпляр xlarge Amazon EC2 з 32 ядрами, ви могли б обробляти майже 32 рази трафік на одному екземплярі.

  • primus Забезпечує загальний API для більшості бібліотек вище для легкого перемикання + покращення стабільності для всіх.

Коли користуватися:

  • використовувати основні сервери WebSocket, коли ви хочете використовувати вбудовані реалізації WebSocket на стороні клієнта, остерігайтеся нездатностей браузера

  • використовувати резервні бібліотеки, коли ви дбаєте про резервні копії браузера

  • використовуйте повнофункціональні бібліотеки, коли ви дбаєте про канали

  • використовуйте primus, коли ви не маєте уявлення про те, чим користуватися, ви не в змозі переписувати додаток, коли вам потрібно перемикати рамки через зміни вимог проекту або потрібна додаткова стабільність з'єднання.

Де перевірити:

Firecamp - це середовище для тестування графічного інтерфейсу для SocketIO, WS та всіх основних технологій у режимі реального часу. Налагоджуйте події в режимі реального часу під час його розробки.


10
Дякую за детальну відповідь. Чи можете ви пояснити пункт 3, коли слід використовувати. Які канали посилаються на точку? Я новачок у веб-розетках і намагаюся зрозуміти, який з них використовувати в моєму випадку.
Akshat Jiwan Sharma

2
А як щодо Autobahn / WAMP?
Еміль Корм'є

1
Хороший список усіх доступних варіантів після смерті now.js
Рахул Прасад

@AkshatJiwanSharma: "Канали" - це так звані "кімнати", які кожен гравець у кімнаті може обмінюватися повідомленнями ..
Marwen Trabelsi

4
Невелика деталь для ws полягає в тому, що їй потрібен пітон. Отже, якщо ви розгортаєте докерні контейнери чи щось подібне, вам потрібно буде мати доступний 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, який "відчуває", як випромінювач події по дроту.
hammett

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. ???) отримати 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.
Prahlad Yeri

ви можете імітувати маршрути, якщо цього хочете.
Лукас Теттаманті

1
використання express-wsдозволяє додавати wsмаршрути в експрес-програму.
Дмитро Маслі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.