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服务器。
笔者关于性能的测试,略显简单,如有不当之处,请指正,谢谢。