nodejs消息推送之socket.io 与 ws对比

node.js的websocket库目前比较热门的是ws和socket.io。我们对比一下这两个库。

一、笔者写这篇文章时,ws的周下载量是4百多万,最近一次更新是11天前,总共98个版本。

socket.io周下载量接近2百万,最近一次更新是三个月前。总共110个版本

从npm上看,使用ws的比socket.io多很多,活跃度差不多。

二、ws客户端不支持浏览器,需要用户自行封装websocket。

socket.io客户端对浏览器有良好的支持。socket.io客户端封装的websocket请求自带id,服务器可以根据id区分客户端,进行精准推送。

三、

ws和socket.io都可以单独作为websocket服务器,也可以挂到express和koa框架,同时提供web和websocket服务。

四、

笔者简单测试了一下两个库的性能,websocket集成到koa框架,代码如下:

ws服务端:

let server = http.createServer(app.callback());
const wss = new WebSocket.Server({ server });
let count = 0;
let beginTime = Date.now();
wss.on('connection', function connection(ws) {
    ws.on('message', function (data) {
        console.log(data+', count: ', count++);
        if(count === 10000){
            let endTime = Date.now();
            console.log('use time: ', endTime-beginTime);
        }
    });

});

server.listen(4001);

ws客户端:

const WebSocket = require('ws');
for(let i = 0; i<10000;i++){
    let ws = new WebSocket("ws://localhost:4001");
    ws.on('open', function open() {
    ws.send('hello');
});
}

启5000个客户端时,ws用时12973毫秒。启10000个客户端时,用时19050毫秒。启20000个客户端时,直接报错:

socket.io服务端:

let server = http.createServer(app.callback());
let socketIo = new SocketIo(server);
let count = 0;
let beginTime = Date.now();
socketIo.on('connection', function(client){
    client.on('hello', function (data) {
        console.log(data+', count: ', count++);
        if(count === 10000){
            let endTime = Date.now();
            console.log('use time: ', endTime-beginTime);
        }
    });
});

server.listen(4001);

socket.io客户端:

const socketIo = require('socket.io-client');
for(let i = 0;i<10000;i++){
    let socket = new socketIo('http://localhost:4001');
    socket.emit('hello', 'hello');
}

启5000个客户端时,用时29215毫秒,启10000个客户端时,socket.io跑到8千多个就启不了了:

结果是,ws正如它宣称的:速度最快的websocket库之一。速度要比socket.io快一倍。socket.io连接数不足时客户端不会报错,健壮性比ws好。ws客户端在封装时需要考虑连接数不足时的错误处理。

另外,连接数的多少跟服务器有关,线上部署时,需要进行设置,在此不详述。

通过对比,笔者决定选择ws做为node.js的websocket服务器。

猜你喜欢

转载自blog.csdn.net/swimming_in_IT_/article/details/81451491