【发布时间】:2015-10-19 18:20:08
【问题描述】:
我有一个使用 socket.io 的基本实时服务器。我的问题涉及闭包和垃圾收集,以及我是否应该费心将套接字连接存储在关联数组中,或者只是将其留给闭包来管理连接。
我遇到的一个问题是,如果套接字连接断开,如果在断开连接的套接字上调用 emit,同一个套接字连接是否会尝试发送消息?换句话说,当您在断开连接的套接字上调用 socket.emit() 时会发生什么?
这是一些代码,底部有问题:
var socketio = require('socket.io);
var io = socketio.listen(server);
var EE = require('events').EventEmitter;
var ee = new EE(); //this is actually initialized elsewhere but now you know what it is
var connectedUsers = {}; //associative array to store socket connections by socket.id
io.on('connection', function (socket) {
connectedUsers[socket.id] = socket; //should I bother storing the socket connections in the associative array or just leave it to the closure to store them
socket.on('disconnect', function () {
connectedUsers[socket.id] = null; //should I bother removing
});
ee.on('update',function(data){
socket.emit('update',JSON.stringify(data));
});
ee.on('insert',function(data){
socket.emit('insert',JSON.stringify(data));
});
ee.on('delete',function(data){
socket.emit('delete',JSON.stringify(data));
});
});
}
所以我的主要问题/担忧是,用于闭包的内存量将随着套接字连接的数量线性增长,并且永远不会停止或减少。 socket.io 断开连接事件是否通过垃圾回收释放内存?
看来我需要重新组织上面的代码来完成两件事:
允许进行垃圾收集以便服务器内存 足迹不会无限增长
避免发布所有数据 每一个socket连接,这就是它现在正在做的事情。
这准确吗?
【问题讨论】:
标签: node.js sockets websocket socket.io closures