Jakiej biblioteki websocket używać z Node.js? [Zamknięte]

429

Obecnie istnieje wiele bibliotek websocket dla node.js, najpopularniejsze wydają się:

Jednak nie mogę znaleźć żadnych konkretnych porównań między nimi ... Najwyraźniej Socket.io był niesamowity, ale stał się dość przestarzały i ma błędne wersje. Zarówno ws, jak i websocket-node twierdzą, że są najszybsze. Engine.io wydaje się nowy, ale o wiele cięższy niż lżejsze aletarntives.

Byłoby wspaniale, gdybyśmy my lub ktoś mógł ułożyć odpowiedź, która służy jako przewodnik na temat tego, która biblioteka gniazd ma być używana i kiedy, a także porównanie między nimi.

balupton
źródło
246
Jeśli to się zamknie, gdzie powinno pójść takie pytanie? Ponieważ odpowiedź będzie niezwykle przydatna ... Wydaje się niefortunne, że tak ważne pytanie nie powinno tu dotyczyć.
balupton
14
Woot woot dla wiki społeczności, co oznacza, że ​​pomimo zamkniętego pytania z nowych odpowiedzi, nadal możemy poprawić odpowiedź społeczności wiki poniżej :)
balupton
14
Zgadzam się, chciałbym, aby tego rodzaju pytania były nie tylko dozwolone, ale zachęcane. OK, mogą nie być istotne za lata, ale do tego czasu uratują świat.
John Little
1
@balupton czy możesz zaktualizować społeczność według własnego wyboru i czy jesteś z tego zadowolony? czy to jest socket.io?
C grafika
3
@ Grafiki Używam Primus z ws w dzisiejszych czasach, ponieważ WS jest wszystkim, czego potrzebuję, jeśli potrzebuję czegoś bardziej ekstremalnego, po prostu wymieniam bibliotekę bazową i zachowuję ten sam interfejs API dzięki Primusowi. Działa cuda.
balupton

Odpowiedzi:

390

Rozwijanie piłki dzięki tej odpowiedzi wiki społeczności . Czuć się swobodnie edytować mnie z twoich ulepszeń.

  • serwer i klient ws WebSocket dla node.js. Jedna z najszybszych bibliotek, jeśli nie najszybsza.

  • serwer i klient WebSocket -node WebSocket dla node.js

  • websocket-driver-node WebSocket serwer i parser protokołu klienta node.js - używany w faye-websocket-node

  • faye-websocket-node Serwer i klient WebSocket dla node.js - używany w faye i sockjs

  • serwer i klient socket.io WebSocket dla node.js + klient dla przeglądarek + (v0 ma najnowsze do najstarszych awarie, v1 Socket.io używa engine.io) + kanały - używane w stack.io. Biblioteka klienta próbuje połączyć się ponownie po rozłączeniu.

  • Serwer i klient WebSocket sockjs dla node.js i innych + klient dla przeglądarek + od najnowszych do najstarszych

  • faye serwer i klient WebSocket dla node.js i innych + klient dla przeglądarek + awaryjne + obsługa innych języków po stronie serwera

  • Klasterowy serwer czasu rzeczywistego deepstream.io, który obsługuje połączenia WebSockets i TCP oraz zapewnia synchronizację danych, pub / sub oraz żądanie / odpowiedź

  • socketcluster klaster serwerów WebSocket, który wykorzystuje wszystkie rdzenie procesora na twoim komputerze. Na przykład, jeśli miałbyś użyć instancji xlarge Amazon EC2 z 32 rdzeniami, byłbyś w stanie obsłużyć prawie 32-krotny ruch w pojedynczej instancji.

  • primus Zapewnia wspólny interfejs API dla większości powyższych bibliotek w celu łatwego przełączania + poprawy stabilności dla wszystkich z nich.

Kiedy użyć:

  • korzystaj z podstawowych serwerów WebSocket, jeśli chcesz korzystać z natywnych implementacji WebSocket po stronie klienta, uważaj na niezgodności przeglądarki

  • korzystaj z bibliotek rezerwowych, jeśli zależy Ci na rezerwach przeglądarek

  • korzystaj z pełnych bibliotek, gdy zależy Ci na kanałach

  • używaj primusa, gdy nie masz pojęcia, czego użyć, nie masz ochoty na przepisywanie aplikacji, gdy potrzebujesz zmienić frameworki ze względu na zmieniające się wymagania projektu lub potrzebujesz dodatkowej stabilności połączenia.

Gdzie testować:

Firecamp to środowisko testowe z interfejsem GUI dla SocketIO, WS i wszystkich głównych technologii czasu rzeczywistego. Debuguj wydarzenia w czasie rzeczywistym podczas ich opracowywania.

balupton
źródło
10
Dziękuję za szczegółową odpowiedź. Czy możesz wyjaśnić, kiedy należy użyć punktu 3? Do jakich kanałów odnosi się ten punkt? Jestem nowy w websockets i staram się zrozumieć, którego użyć w moim przypadku.
Akshat Jiwan Sharma
2
Co z Autobahn / WAMP?
Emile Cormier
1
Ładna lista wszystkich dostępnych opcji po śmierci now.js
Rahul Prasad
@AkshatJiwanSharma: Kanały to tak zwane „pokoje”, w których każdy gracz w pokoju może wymieniać wiadomości.
Marwen Trabelsi
4
Drobnym szczegółem dla ws jest to, że potrzebuje Pythona. Jeśli więc wdrożysz na kontenerach dokerów lub czymś takim, będziesz musiał mieć do dyspozycji Pythona ws.
AntouanK
40

Aktualizacja: Ta odpowiedź jest nieaktualna, ponieważ od tego czasu wydawane są nowsze wersje wymienionych bibliotek.

Socket.IO v0.9 jest przestarzały i nieco wadliwy, a Engine.IO jest tymczasowym następcą. Socket.IO v1.0 (która zostanie wkrótce wydana) będzie korzystać z Engine.IO i będzie znacznie lepsza niż v0.9. Polecam używać Engine.IO do czasu wydania Socket.IO v1.0.

„ws” nie obsługuje cofania, więc jeśli przeglądarka klienta nie obsługuje websockets, nie będzie działać, w przeciwieństwie do Socket.IO i Engine.IO, które korzystają z długiego odpytywania itp., jeśli websockets nie są dostępne. Jednak „ws” wydaje się w tej chwili najszybszą biblioteką.

Zobacz mój artykuł porównujący Socket.IO, Engine.IO i Primus: https://medium.com/p/b63bfca0539

Deniz Ozger
źródło
Przypomina mi to zwykłe Node.js 0.12 jest natychmiastowe … twierdzą też, że od miesięcy. Prawdopodobnie będziemy musieli poczekać i zobaczyć…
Golo Roden
1
Czy masz jakieś spostrzeżenia / doświadczenia z Autobahn / WAMP ( wamp.ws )?
Emile Cormier
6
Socket.IO wydało swoją wersję 1. Engine.io nie jest jego zamiennikiem, ale jest wykorzystywany wewnętrznie przez Socket.IO jako protokół transportowy - pobiera rzeczywistą komunikację między punktami końcowymi (xhr, ws) i ma prosty format pakietów. Socket.io zapewnia bogatszy interfejs API, który „czuje się” jak emiter zdarzeń na przewodzie.
hammett
29

npm ws było dla mnie odpowiedzią. Uznałem, że jest to mniej inwazyjne i bardziej bezpośrednie. Dzięki temu łączenie stron internetowych z usługami odpoczynku było banalne. Udostępniono prosty kod w tym poście.

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
źródło
Jak uzyskać adres URL żądania w metodzie połączenia? wss.on ("połączenie", funkcja (ws) {// jakiś kod console.log (ws. ???) pobierz adres URL}}
Opalosolo
nie ma adresu URL żądania jak w żądaniach ajax. Biblioteka javascript otwiera połączenie z serwerem sieciowym, używając adresu takiego jak 127.0.0.1:8080 lub cokolwiek.com:7777 itd. Brzmi myląco, spróbuj przejść przez prosty samouczek na temat gniazd sieciowych.
MFAL,
5
W rzeczywistości punkty końcowe WebSocket również mają adres URL, zaczynają się od ws, na przykład ws://myserver.com. I tak, można je skonfigurować do obsługi również przy użyciu portów 80 i 443. Korzystając z odwrotnego proxy, takiego jak nginx, możesz kierować WebSocketadresy URL protokołu do innego portu z normalnych protokołów HTTP.
Prahlad Yeri,
możesz symulować trasy, jeśli chcesz.
Lucas Tettamanti
1
użycie express-wspozwala dodawać wstrasy w ekspresowej aplikacji.
Dmitry Masley,