在 websocket 中一次仅允许一个连接

问题描述 投票:0回答:1

当有人连接到我的 websocket 时,我希望最后打开的连接处于活动状态并关闭所有其他旧连接。每个用户都有唯一的令牌。这是我创建的代码:

wss.on('connection', function connection(ws,req) {

     const myURL = new URL("https://example.com"+req.url);
         var token = myURL.searchParams.get('token');
         ws.send("success");
         
      exists =  users.hasOwnProperty(token);
      if(exists)
      {
          //console.log("Token exists already");
       //   ws.send("fail");
        //  ws.close();
          users[token]["ws"].send("fail");
          users[token]["ws"].close();

         users[token] = [];
         users[token]["ws"] = ws;
         
      }
      else 
      {
            
         users[token] = [];
         users[token]["ws"] = ws;
         //console.log('connected: ' + token + ' in ' + Object.getOwnPropertyNames(users)); 
      }
          
      

 ws.on('close', function () {
    delete users[token]
    //console.log('deleted: ' + token);

             
     
 })  
      



});

但是上面的代码只能在第一次运行。如果我第三次打开,第二次和第三次连接都处于活动状态。我想关闭第二个并保留第三个。

javascript node.js websocket
1个回答
1
投票

您可能想使用对象而不是数组

所以

users[token] = {};

而不是

users[token] = [];

当新连接到来时,我会关闭所有其他连接,所以新的连接处理程序是这样的

wss.on('connection', function connection(ws, req) {

    const myURL = new URL("https://example.com" + req.url);
    var token = myURL.searchParams.get('token');
    ws.send("success");

    exists = users.hasOwnProperty(token);

    for(const token in users){ // close all existing connections
        users[token]["ws"].send("fail");
        users[token]["ws"].close();
    }

    if (exists) {
        users[token]["ws"] = ws; // update websocket
    }
    else {
        users[token] = {ws: ws}; // add new websocket to users
        // same thing as
        // users[token] = {}
        // users[token]["ws"] = ws
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.