如何正确删除websocket连接onClose

How to remove websocket connection onClose properly

本文关键字:连接 onClose websocket 删除 何正确      更新时间:2023-09-26

请看下面的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个随机客户端,日志打印总是相同的名称…

你知道我做错了什么吗?

clientsclientsReverse都不是数组。这些是物体。对象的行为有点像JavaScript中的hashmap,所以你可以用字符串访问它们的属性。例如:

var a = { b: 5 };
console.log(a['b']); //5

如果您尝试从一个对象(newclient是一个对象)中创建索引,它将首先toString它。newclient.toString()的结果是[object Object],对于你使用的每个对象,它是一个不同的对象并不重要。这就是为什么即使你使用不同的newclient对象,它总是解析到相同的键。

我不知道你到底想达到什么目的。您可以尝试使用数组([]),但它们只能有数字索引。您还可以尝试使用客户机的某种独特属性,例如它们的id或名称。