请看下面的src-code:
var clients = {}; // map<string, Connection> clients
var clientsReverse = {}; // map<Connection, string> clientsReverse
webSocketServer.on('connection', function(newclient) { // newclient is connection Object
newclient.on('message', function(message) {
var data = JSON.parse(message);
if (clients[data.name] === undefined) {
clients[data.name] = newclient;
clientsReverse[newclient] = data.name;
}
// ...
});
newclient.on('close', function(){
log(clientsReverse[newclient]); // prints always the same string
// remove closed connection
var key = clientsReverse[newclient];
delete clientsReverse[newclient];
delete clients[key];
});
});
如果客户端离开,我必须删除连接。正如您所看到的,我使用了两个数组,但不幸的是它不起作用。如果我尝试断开3个随机客户端,日志打印总是相同的名称…
你知道我做错了什么吗?
clients
和clientsReverse
都不是数组。这些是物体。对象的行为有点像JavaScript中的hashmap,所以你可以用字符串访问它们的属性。例如:
var a = { b: 5 };
console.log(a['b']); //5
如果您尝试从一个对象(newclient
是一个对象)中创建索引,它将首先toString
它。newclient.toString()
的结果是[object Object]
,对于你使用的每个对象,它是一个不同的对象并不重要。这就是为什么即使你使用不同的newclient
对象,它总是解析到相同的键。
[]
),但它们只能有数字索引。您还可以尝试使用客户机的某种独特属性,例如它们的id或名称。