Яку бібліотеку веб-сокетів використовувати для 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.