Hangi websocket kütüphanesi Node.js ile kullanılacak? [kapalı]


429

Şu anda node.js için çok sayıda websocket kütüphanesi var , en popüler gibi görünüyor:

Ancak hiçbiri arasında sağlam bir beton karşılaştırma bulamıyorum ... Görünüşe göre Socket.io harikaydı, ama oldukça tarihli ve yapıları başarısız oldu. Hem ws hem de websocket-node en hızlı olduklarını iddia ediyor. Ve engine.io yeni görünüyor, ancak daha hafif aletarntive'lardan çok daha ağır.

Biz veya birisinin hangi soket kütüphanesinin kullanılacağı ve ne zaman kullanılacağı konusunda bir rehber görevi gören bir yanıtı bir araya getirebilmemiz şaşırtıcı olurdu.


246
Bu kapanırsa, böyle bir soru nereye gitmeli? Cevap inanılmaz derecede faydalı olacağı için ... Böyle önemli bir sorunun burada kalmaması gerektiği için talihsiz görünüyor.
balupton

14
Topluluk wikileri için woot woot, yani soru yeni cevaplardan kapatılsa da, aşağıdaki topluluk wiki yanıtını hala geliştirebiliriz :)
balupton

14
Kabul ediyorum, bu tür bir soruyu sadece izin vermekle kalmayıp cesaretlendirildiğini görmek istiyorum. Tamam, yıllarca alakalı olmayabilirler, ancak o zamana kadar dünyayı kurtaracaklar.
John Little

1
@balupton topluluğu istediğiniz gibi güncelleyebilir ve ondan memnunsanız? socket.io nedir?
C grafikleri

3
@Cgraphics Bugünlerde ws ile Primus kullanıyorum, ws ihtiyacım olduğu gibi, daha aşırı bir şeye ihtiyacım olursa, sadece undering kütüphanesini değiştiririm ve Primus sayesinde aynı api'yi tutarım. Harikalar yaratıyor.
balupton

Yanıtlar:


390

Bu topluluk wiki yanıtı ile topu yuvarlatma . İyileştirmelerinizle beni düzenlemekten çekinmeyin .

  • ws WebSocket sunucusu ve node.js istemcisi. En hızlı kütüphanelerden biri en hızlı kütüphanelerden biri değilse.

  • websocket-node node.js için WebSocket sunucusu ve istemcisi

  • websocket-driver-node WebSocket sunucusu ve istemci protokolü ayrıştırıcı node.js - faye-websocket-node'da kullanılır

  • node.js için faye-websocket-node WebSocket sunucusu ve istemcisi - faye ve sockjs'de kullanılır

  • socket.io WebSocket sunucusu ve node.js için istemci + tarayıcılar için istemci + (v0 en yeni ve en eski yedeklere sahiptir, Socket.io'nun v1'i engine.io kullanır) + kanalları - stack.io'da kullanılır. İstemci kitaplığı bağlantı kesildiğinde yeniden bağlanmaya çalışır.

  • node.js ve diğerleri için sockjs WebSocket sunucusu ve istemcisi + tarayıcılar için istemci + en yeniden en eskiye doğru yedekler

  • faye WebSocket sunucusu ve node.js ve diğerleri için istemci + tarayıcılar için istemci + yedekler + diğer sunucu tarafı dilleri için destek

  • WebSockets ve TCP bağlantılarını işleyen ve veri senkronizasyonu, pub / sub ve istek / yanıt sağlayan deepstream.io kümelenebilir gerçek zamanlı sunucu

  • socketcluster Makinenizdeki tüm CPU çekirdeklerini kullanan WebSocket sunucu kümesi. Örneğin, 32 çekirdekli bir xlarge Amazon EC2 örneği kullanacak olsaydınız, tek bir örnekte trafiğin neredeyse 32 katını kaldırabileceksiniz.

  • primus Tüm kütüphaneler için kolay geçiş + kararlılık iyileştirmeleri için yukarıdaki kütüphanelerin çoğu için ortak bir API sağlar.

Ne zaman kullanılır:

  • istemcilerde yerel WebSocket uygulamalarını kullanmak istediğinizde temel WebSocket sunucularını kullanın, tarayıcı uyumsuzluklarına dikkat edin

  • tarayıcı yedeklerini önemsediğinizde yedek kitaplıkları kullanın

  • kanalları önemsediğinizde tam özellikli kitaplıkları kullanın

  • ne kullanacağınız hakkında hiçbir fikriniz olmadığında primus kullanın, proje gereksinimleri değiştiğinden veya ek bağlantı kararlılığına ihtiyaç duyduğunuzda çerçeveleri değiştirmeniz gerektiğinde uygulamanızı yeniden yazma havasında değilsiniz.

Nerede test edilir:

Firecamp , SocketIO, WS ve tüm büyük gerçek zamanlı teknoloji için bir GUI test ortamıdır. Geliştirirken gerçek zamanlı olayların hatalarını ayıklayın.


10
Detaylı cevap için teşekkürler. 3. noktayı ne zaman kullanacağınızı açıklar mısınız? Noktanın bahsettiği kanallar nelerdir? Websockets'te yeniyim ve benim durumumda hangisini kullanacağımı anlamaya çalışıyorum.
Akshat Jiwan Sharma

2
Autobahn / WAMP ne olacak?
Emile Cormier

1
Now.js ölümünden sonra mevcut tüm seçeneklerin güzel listesi
Rahul Prasad

@AkshatJiwanSharma: Kanallar sözde 'oda' mesajları değiştirebilir bir odada her oyuncu .. olduğunu
Marwen Trabelsi

4
Ws için küçük bir ayrıntı, python'a ihtiyaç duymasıdır. Bu nedenle, docker kapsayıcılarına veya başka bir şeye dağıtırsanız, kullanabileceğiniz python'a sahip olmanız gerekir ws.
AntouanK

40

Güncelleme: Bahsedilen kitaplıkların daha yeni sürümleri o zamandan beri yayınlandığından bu yanıt eskidir.

Socket.IO v0.9 modası geçmiş ve biraz buggy ve Engine.IO geçici halef. Socket.IO v1.0 (yakında yayınlanacak) Engine.IO'yu kullanacak ve v0.9'dan çok daha iyi olacak. Socket.IO v1.0 yayınlanana kadar Engine.IO kullanmanızı öneririm.

"ws" yedeklemeyi desteklemez, bu nedenle istemci tarayıcı web soketlerini desteklemiyorsa, web soketleri yoksa Socket.IO ve uzun çağırma vb. kullanan Engine.IO'nun aksine çalışmaz. Ancak, "ws" şu anda en hızlı kütüphane gibi görünüyor.

Socket.IO, Engine.IO ve Primus'u karşılaştıran makaleme bakın: https://medium.com/p/b63bfca0539


Bu bana her zamanki Node.js 0.12'nin anında olduğunu hatırlatıyor … aylardır bunu da iddia ediyorlar. Yani, muhtemelen, beklemek ve görmek zorundayız…
Golo Roden

1
Autobahn / WAMP ( wamp.ws ) ile ilgili herhangi bir öneriniz / deneyiminiz var mı?
Emile Cormier

6
Socket.IO v1'ini çıkardı. Engine.io bunun yerine geçmez, ancak dahili olarak Socket.IO tarafından taşıma protokolü olarak kullanılır - uç noktalar (xhr, ws) arasındaki gerçek iletişimi soyutlar ve paketler için basit bir formata sahiptir. Socket.io, tel üzerinde yayılan bir olay gibi 'hissedilen' daha zengin bir API sağlar.
hammett

29

npm ws benim için bir cevaptı. Daha az müdahaleci ve daha düz buldum. Bununla birlikte, websockets'i dinlenme hizmetleriyle karıştırmak da önemsizdi. Bu yayında paylaşılan basit kod.

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

Bağlantı yönteminde istek URL'si nasıl alınır? wss.on ("bağlantı", işlev (ws) {// bazı kod console.log (ws. ???) get url ...}
Opalosolo

ajax isteklerinde olduğu gibi bir istek URL'si yoktur. Javascript kütüphanesi, 127.0.0.1:8080 veya herhangi bir adres.com:7777 vb. Gibi bir adresi kullanarak web soketi sunucunuza bir bağlantı açar. Bu kafa karıştırıcı geliyor, web soketleri üzerinde bazı basit öğretici geçmeye çalışın.
MFAL

5
Aslında WebSocket bitiş noktaları onlar ile başlar, çok url var wsgibi ws://myserver.com. Ve evet, 80 ve 443 bağlantı noktaları kullanılarak da sunulacak şekilde yapılandırılabilirler. Nginx gibi bir ters proxy kullanarak, WebSocketprotokol URL'lerini normal HTTP protokollerinden başka bir bağlantı noktasına yönlendirebilirsiniz.
Prahlad Yeri

isterseniz rotaları simüle edebilirsiniz.
Lucas Tettamanti

1
kullanarak ekspres app rota express-wseklemenize izin verir ws.
Dmitry Masley
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.