Thư viện websocket nào sẽ sử dụng với Node.js? [đóng cửa]


429

Hiện tại có rất nhiều thư viện websocket cho node.js, phổ biến nhất dường như là:

Tuy nhiên tôi không thể tìm thấy bất kỳ sự so sánh cụ thể nào giữa bất kỳ ai trong số họ ... Rõ ràng là Socket.io thật tuyệt vời, nhưng đã trở nên khá lỗi thời và đã thất bại trong các bản dựng. Cả ws và websocket-nút đều khẳng định chúng là nhanh nhất. Và engine.io có vẻ mới, nhưng nặng hơn rất nhiều so với các aletarntives nhẹ hơn.

Thật tuyệt vời nếu chúng ta hoặc ai đó có thể đưa ra một câu trả lời đóng vai trò là một hướng dẫn về việc sử dụng thư viện socket nào và khi nào, cũng như so sánh giữa chúng.


246
Nếu điều này bị đóng lại, một câu hỏi như thế này nên đi đâu? Vì câu trả lời sẽ vô cùng hữu ích ... Có vẻ không may là một câu hỏi nổi bật như vậy không nên nằm ở đây.
balupton

14
Woot woot cho cộng đồng wiki, có nghĩa là mặc dù câu hỏi đã bị đóng từ câu trả lời mới, chúng tôi vẫn có thể cải thiện câu trả lời wiki cộng đồng bên dưới :)
balupton

14
Tôi đồng ý, tôi muốn thấy loại câu hỏi này không chỉ được cho phép, mà còn được khuyến khích. OK, họ có thể không liên quan trong một năm, nhưng đến lúc đó họ sẽ cứu thế giới.
John Little

1
@balupton bạn có thể cập nhật cộng đồng với sự lựa chọn của bạn và nếu bạn hài lòng với nó? Là socket.io?
Đồ họa C

3
@Cgraphics Tôi sử dụng Primus với ws những ngày này, vì ws là tất cả những gì tôi cần, nếu tôi cần một cái gì đó cực đoan hơn, tôi chỉ cần trao đổi thư viện nhấp nhô và giữ nguyên api nhờ Primus. Công trình kỳ diệu.
balupton

Câu trả lời:


390

Bắt bóng lăn với câu trả lời wiki cộng đồng này . Hãy chỉnh sửa tôi với những cải tiến của bạn.

  • ws WebSocket server và client cho node.js. Một trong những thư viện nhanh nhất nếu không phải là thư viện nhanh nhất.

  • máy chủ và máy khách WebSocket -nút cho node.js

  • websocket-driver-node Máy chủ WebSocket và trình phân tích cú pháp giao thức khách node.js - được sử dụng trong faye-websocket-node

  • faye-websocket- máy chủ và máy khách WebSocket cho node.js - được sử dụng trong faye và sockjs

  • máy chủ và máy khách socket.io WebSocket cho node.js + client cho trình duyệt + (v0 có các dự phòng mới nhất đến cũ nhất, v1 của Socket.io sử dụng engine.io) + kênh - được sử dụng trong stack.io. Thư viện khách hàng cố gắng kết nối lại khi ngắt kết nối.

  • sockjs Máy chủ và máy khách WebSocket cho node.js và các ứng dụng khác + máy khách cho trình duyệt + dự phòng mới nhất đến cũ nhất

  • faye máy chủ và máy khách WebSocket cho node.js và các ứng dụng khác + máy khách cho trình duyệt + dự phòng + hỗ trợ cho các ngôn ngữ phía máy chủ khác

  • deepstream.io máy chủ thời gian thực clusterable rằng xử lý WebSockets & TCP kết nối và cung cấp dữ liệu đồng bộ hóa, pub / sub và request / response

  • cụm máy chủ socketcluster WebSocket sử dụng tất cả các lõi CPU trên máy của bạn. Ví dụ: nếu bạn sử dụng một phiên bản xlộng Amazon EC2 với 32 lõi, bạn sẽ có thể xử lý gần 32 lần lưu lượng truy cập trên một phiên bản.

  • primus Cung cấp một API chung cho hầu hết các thư viện ở trên để dễ dàng chuyển đổi + cải thiện độ ổn định cho tất cả chúng.

Khi nào nên sử dụng:

  • sử dụng các máy chủ WebSocket cơ bản khi bạn muốn sử dụng các triển khai WebSocket gốc trên máy khách, hãy cẩn thận với sự không tương thích của trình duyệt

  • sử dụng các thư viện dự phòng khi bạn quan tâm đến dự phòng trình duyệt

  • sử dụng các thư viện đầy đủ tính năng khi bạn quan tâm đến các kênh

  • sử dụng primus khi bạn không biết nên sử dụng cái gì, không có ý định viết lại ứng dụng của bạn khi bạn cần chuyển đổi khung công tác vì thay đổi yêu cầu dự án hoặc cần thêm sự ổn định kết nối.

Nơi để kiểm tra:

Firecamp là một môi trường thử nghiệm GUI cho SocketIO, WS và tất cả các công nghệ thời gian thực chính. Gỡ lỗi các sự kiện thời gian thực trong khi bạn đang phát triển nó.


10
Cảm ơn các câu trả lời chi tiết. Bạn có thể giải thích điểm 3 trong khi sử dụng. Các kênh mà điểm đang đề cập đến là gì? Tôi chưa quen với websockets và đang cố gắng hiểu cái nào sẽ sử dụng trong trường hợp của tôi.
Akshat Jiwan Sharma

2
Autobahn / WAMP thì sao?
Cileier Cormier

1
Danh sách tuyệt vời của tất cả các tùy chọn có sẵn sau cái chết của now.js
Rahul Prasad

@AkshatJiwanSharma: Các kênh được gọi là 'phòng' mà mỗi người chơi trong phòng có thể trao đổi tin nhắn ..
Marwen Trabelsi

4
Một chi tiết nhỏ cho ws là nó cần python. Vì vậy, nếu bạn triển khai trên các container docker hoặc thứ gì đó, bạn sẽ cần có sẵn python để sử dụng ws.
AntouanK

40

Cập nhật: Câu trả lời này đã lỗi thời khi các phiên bản mới hơn của các thư viện được đề cập được phát hành kể từ đó.

Socket.IO v0.9 đã lỗi thời và có một chút lỗi và Engine.IO là sự kế thừa tạm thời. Socket.IO v1.0 (sẽ sớm được phát hành) sẽ sử dụng Engine.IO và tốt hơn nhiều so với v0.9. Tôi khuyên bạn nên sử dụng Engine.IO cho đến khi Socket.IO v1.0 được phát hành.

"ws" không hỗ trợ dự phòng, vì vậy nếu trình duyệt máy khách không hỗ trợ websockets, nó sẽ không hoạt động, không giống như Socket.IO và Engine.IO sử dụng bỏ phiếu dài, v.v. nếu không có sẵn websockets. Tuy nhiên, "ws" có vẻ như là thư viện nhanh nhất vào lúc này.

Xem bài viết của tôi so sánh Socket.IO, Engine.IO và Primus: https://medium.com/p/b63bfca0539


Điều này nhắc nhở tôi về Node.js 0.12 thông thường là ngay lập tức họ cũng tuyên bố rằng trong nhiều tháng nay. Vì vậy, có lẽ, chúng ta sẽ phải chờ xem trận đấu
Golo Roden

1
Bạn có bất kỳ hiểu biết / kinh nghiệm với Autobahn / WAMP ( wamp.ws )?
Cileier Cormier

6
Socket.IO đã phát hành v1. Engine.io không phải là sự thay thế cho nó, nhưng được sử dụng bên trong bởi Socket.IO làm giao thức vận chuyển - nó trừu tượng hóa giao tiếp thực tế giữa các điểm cuối (xhr, ws) và có định dạng đơn giản cho các gói. Socket.io cung cấp một api phong phú hơn, "cảm thấy" giống như một trình phát sự kiện qua dây.
hammett

29

npm ws là câu trả lời cho tôi. Tôi thấy nó ít xâm phạm và thẳng hơn. Với nó cũng là tầm thường để trộn websockets với các dịch vụ nghỉ ngơi. Chia sẻ mã đơn giản trên bài đăng này.

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

Làm thế nào để có được url yêu cầu trong metod kết nối? wss.on ("kết nối", hàm (ws) {// một số mã console.log (ws. ???) nhận url ...}
Opalosolo

không có url yêu cầu như trong yêu cầu ajax. Thư viện javascript mở một kết nối đến máy chủ ổ cắm web của bạn bằng cách sử dụng một địa chỉ như 127.0.0.1:8080 hoặc bất cứ điều gì.com: 7777, v.v .... Nghe có vẻ khó hiểu, hãy thử thực hiện một số hướng dẫn đơn giản về ổ cắm web.
MFAL

5
Trên thực tế, các điểm cuối của WebSocket cũng có url, chúng bắt đầu bằng ws, chẳng hạn như ws://myserver.com. Và vâng, chúng có thể được cấu hình để được phục vụ bằng các cổng 80 và 443. Sử dụng proxy ngược như nginx, bạn có thể định tuyến các WebSocketurl giao thức đến một cổng khác từ các giao thức HTTP thông thường.
Prahlad Yeri

bạn có thể mô phỏng các tuyến đường nếu bạn muốn nó.
Lucas Tettamanti

1
sử dụng express-wscho phép thêm wscác tuyến đường trong ứng dụng thể hiện.
Dmitry Masley
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.