ห้องสมุด websocket ใดที่จะใช้กับ Node.js [ปิด]


429

ขณะนี้มีห้องสมุด websocket มากมายสำหรับ node.js ซึ่งเป็นที่นิยมมากที่สุด:

อย่างไรก็ตามฉันไม่พบการเปรียบเทียบที่เป็นรูปธรรมใด ๆ ระหว่างพวกเขา ... เห็นได้ชัดว่า Socket.io ยอดเยี่ยมมาก แต่ก็ค่อนข้างล้าสมัยและไม่สามารถสร้างได้ ทั้ง ws และ websocket-node อ้างว่ามันเร็วที่สุด และ engine.io นั้นดูใหม่ แต่ก็หนักกว่าของ aletarntives ที่เบากว่ามาก

มันจะน่าอัศจรรย์ถ้าเราหรือใครสักคนสามารถรวบรวมคำตอบที่ทำหน้าที่เป็นแนวทางในการใช้ซ็อกเก็ตไลบรารี่และเมื่อใดรวมถึงการเปรียบเทียบระหว่างพวกเขา


246
ถ้าสิ่งนี้ถูกปิดคำถามที่ควรจะเป็นเช่นนี้จะไปที่ไหน? เนื่องจากคำตอบจะมีประโยชน์อย่างไม่น่าเชื่อ ... ดูเหมือนว่าโชคร้ายที่คำถามเด่นดังกล่าวไม่ควรอยู่ที่นี่
balupton

14
woot Woot ชุมชนวิกิหมายถึงว่าแม้จะมีคำถามที่ถูกปิดจากคำตอบใหม่ที่เรายังคงสามารถปรับปรุงคำตอบที่วิกิพีเดียชุมชนด้านล่าง :)
balupton

14
ฉันเห็นด้วยฉันอยากเห็นคำถามประเภทนี้ไม่เพียง แต่ได้รับอนุญาต แต่ได้รับการสนับสนุน ตกลงพวกเขาอาจไม่เกี่ยวข้องในเวลาปี แต่จนถึงพวกเขาจะช่วยโลก
John Little

1
@ balupton คุณสามารถอัปเดตชุมชนด้วยตัวเลือกของคุณและหากคุณมีความสุขกับมัน มันคือ socket.io?
กราฟิก C

3
@ กราฟิคฉันใช้ Primus กับ ws ทุกวันนี้เพราะทุกอย่างที่ฉันต้องการคือถ้าฉันต้องการอะไรที่สุดขั้วฉันแค่เปลี่ยนไลบรารี่ที่อยู่ข้างใต้และเก็บ api เดียวกันขอบคุณ Primus งานมหัศจรรย์
balupton

คำตอบ:


390

การทำให้ลูกบอลกลิ้งด้วยคำตอบของ wiki ชุมชนนี้ รู้สึกอิสระที่จะแก้ไขฉันด้วยการปรับปรุงของคุณ

  • ws WebSocket เซิร์ฟเวอร์และไคลเอ็นต์สำหรับ node.js หนึ่งในห้องสมุดที่เร็วที่สุดหากไม่ใช่ห้องสมุดที่เร็วที่สุด

  • websocket-node เซิร์ฟเวอร์ WebSocket และไคลเอ็นต์สำหรับ node.js

  • websocket-driver-nodeเซิร์ฟเวอร์ WebSocket และ parser โปรโตคอลของไคลเอ็นต์ 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 และอื่น ๆ + ไคลเอนต์สำหรับเบราว์เซอร์ + fallbacks + รองรับภาษาฝั่งเซิร์ฟเวอร์อื่น ๆ

  • deepstream.ioเซิร์ฟเวอร์เรียลไทม์ clusterable ที่จับ WebSockets และเชื่อมต่อ TCP และให้ข้อมูลที่ซิงค์ผับ / ย่อยและขอตอบ /

  • socketcluster WebSocket เซิร์ฟเวอร์คลัสเตอร์ซึ่งใช้ประโยชน์จากแกน CPU ทั้งหมดบนเครื่องของคุณ ตัวอย่างเช่นหากคุณต้องใช้อินสแตนซ์ x40 ของ Amazon EC2 ที่มี 32 คอร์คุณจะสามารถจัดการการรับส่งข้อมูลได้เกือบ 32 เท่าในอินสแตนซ์เดียว

  • primusจัดเตรียม API ทั่วไปสำหรับไลบรารีส่วนใหญ่ข้างต้นเพื่อให้ง่ายต่อการเปลี่ยน + การปรับปรุงเสถียรภาพสำหรับพวกเขาทั้งหมด

ควรใช้เมื่อใด:

  • ใช้เซิร์ฟเวอร์ WebSocket ขั้นพื้นฐานเมื่อคุณต้องการใช้การปรับใช้ WebSocket ดั้งเดิมในเครื่องไคลเอนต์ระวังเบราว์เซอร์ที่ไม่เข้ากัน

  • ใช้ไลบรารีทางเลือกเมื่อคุณใส่ใจกับทางเลือกเบราว์เซอร์

  • ใช้ไลบรารีที่โดดเด่นเต็มรูปแบบเมื่อคุณใส่ใจกับช่อง

  • ใช้พรีมัสเมื่อคุณไม่มีความคิดเกี่ยวกับสิ่งที่จะใช้ไม่ได้อยู่ในอารมณ์ที่จะเขียนแอปพลิเคชันของคุณใหม่เมื่อคุณต้องการเปลี่ยนเฟรมเวิร์กเนื่องจากการเปลี่ยนแปลงข้อกำหนดของโครงการหรือต้องการความเสถียรในการเชื่อมต่อเพิ่มเติม

ทดสอบที่ไหน:

Firecampเป็นสภาพแวดล้อมการทดสอบ GUI สำหรับ SocketIO, WS และเทคโนโลยีเรียลไทม์ที่สำคัญทั้งหมด แก้ไขข้อบกพร่องของเหตุการณ์แบบเรียลไทม์ในขณะที่คุณกำลังพัฒนา


10
ขอบคุณสำหรับคำตอบโดยละเอียด คุณช่วยอธิบายจุด 3 เมื่อใช้งานได้ไหม แชนเนลที่จุดนี้อ้างถึงคืออะไร ฉันยังใหม่กับ websockets และพยายามเข้าใจว่าควรใช้อันไหนในกรณีของฉัน
Akshat Jiwan Sharma

2
แล้ว Autobahn / WAMP ล่ะ?
Emile Cormier

1
รายการตัวเลือกที่ดีทั้งหมดหลังจากการตายของ now.js
ราหุล

@AkshatJiwanSharma: แชนแนลเป็นชื่อที่เรียกว่า 'ห้อง' ผู้เล่นแต่ละคนในห้องสามารถแลกเปลี่ยนข้อความได้
Marwen Trabelsi

4
รายละเอียดเล็ก ๆ สำหรับwsคือมันต้องการหลาม 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 ) หรือไม่?
Emile Cormier

6
Socket.IO เปิดตัว v1 Engine.io ไม่ใช่การแทนที่ แต่ใช้ภายในโดย Socket.IO เป็นโปรโตคอลการขนส่ง - มันสรุปการสื่อสารจริงระหว่างจุดปลาย (xhr, ws) และมีรูปแบบที่เรียบง่ายสำหรับแพ็กเก็ต Socket.io มอบ api ที่สมบูรณ์ยิ่งขึ้นที่ 'รู้สึก' เหมือนเหตุการณ์ที่ปล่อยผ่านสาย
hammett

29

npm ws คือคำตอบสำหรับฉัน ฉันพบว่ามันรบกวนน้อยลงและตรงไปข้างหน้ามากขึ้น ด้วยมันเป็นเรื่องไม่สำคัญที่จะผสมผสาน websockets กับบริการที่เหลือ รหัสง่าย ๆ ที่แชร์ในโพสต์นี้

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 ในการเชื่อมต่อ metod wss.on ("การเชื่อมต่อ", ฟังก์ชั่น (ws) {// บางรหัส console.log (ws. ???) รับ url ... }
Opalosolo

ไม่มี URL คำขอเช่นเดียวกับคำขอ Ajax ไลบรารี javascript เปิดการเชื่อมต่อกับเซิร์ฟเวอร์เว็บซ็อกเก็ตของคุณโดยใช้ที่อยู่เช่น 127.0.0.1:8080 หรือ Anything.com:7777 และอื่น ๆ มันฟังดูสับสนลองใช้บทช่วยสอนง่ายๆบนเว็บซ็อกเก็ต
MFAL

5
ที่จริงปลายทาง WebSocket มี URL เกินไปพวกเขาเริ่มต้นด้วยเช่นws ws://myserver.comและใช่พวกเขาสามารถกำหนดค่าให้บริการโดยใช้พอร์ต 80 และ 443 ด้วย การใช้ reverse proxy เช่น nginx คุณสามารถกำหนดเส้นทางWebSocketโปรโตคอลไปยังพอร์ตอื่นจากโปรโตคอล HTTP ปกติ
Prahlad Yeri

คุณสามารถจำลองเส้นทางหากคุณต้องการ
Lucas Tettamanti

1
การใช้express-wsช่วยให้สามารถเพิ่มwsเส้นทางในแอปด่วน
Dmitry Masley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.