websocket socket.io 可以加入房间,但不能离开房间

nwlls2ji  于 2023-04-12  发布在  其他
关注(0)|答案(2)|浏览(156)

我正在使用Express和www.example.com建立一个基本的聊天室服务socket.io,我遇到了一个问题,我可以加入,但不能离开房间。

io.on('connection', (client) => {
  client.on('login', (msg) => {
    room_name = 'room'+msg.id

    console.log('login', room_name);

    var room = io.nsps['/'].adapter.rooms[room_name];
    var numClients = room ? room.length : 0;
    console.log('number of clients', numClients);

    client.join(room_name)
  });

  client.on('logout', (msg) => {
    room_name = 'room'+msg.id
    console.log('logout', room_name)

    var room = io.nsps['/'].adapter.rooms[room_name];

    client.leave(room_name, function(err) {
      var room_t = io.nsps['/'].adapter.rooms[room_name];
      if (room_t) {
        console.log("after leaving - room", room_t)
      }
    });
  });
});

从前端,我知道socket发射正在正确传输,因为我得到了'login'和'logout'控制台日志语句。然而,在client.on('logout')中,我似乎没有正确离开房间。每当我查看房间中客户端数量的控制台日志语句时,它似乎从未减少,正如我离开后所期望的那样。进一步,在检查console.log("after leaving - room", room_t)语句后,room_t包含了关于房间的所有旧信息(显示客户端实际上没有离开房间)。如果我执行client.leave(room)client.leave(room_name),我会得到相同的结果。(我已经确保room_names对于登录和注销都是相同的)
有趣的是,我可以在加入后立即离开房间。例如,在client.on(login)中,如果我加入房间然后立即离开房间,那么我完全没有问题。不知道那里发生了什么。
先谢谢你了!
版本:

  • 简体中文
  • 节点v13.12.0
  • express 4.17.1
  • socket.iowww.example.com@2.3.0
js5cn81o

js5cn81o1#

这里的问题是,这是一个错误,这是更多的约8岁,socket.io从来没有费心修复。
你可以在这里看到一个git问题:https://github.com/socketio/socket.io/issues/463
客户端实际上已断开连接。
检查客户端的方法如下:

//Put this under the io.on('connection' ....

io.clients((error, clients) => {

  if (error) throw error;

  console.log(clients); 

// => [6em3d4TJP8Et9EMNAAAA, G5p55dHhGgUnLUctAAAB]
//It should give you an array of connected client with thier socket.id

});
kokeuurv

kokeuurv2#

试试这个:

client.on('leave', (room) => {
  client.rooms.forEach((room) => {
    client.leave(room)
  });
});

相关问题