繁体   English   中英

在Socket.IO中未正确分配房间名称

[英]Room name is not assigned correctly in Socket.IO

在客户端按下按钮后,将socket.emit ,其参数由输入框定义。 这是服务器端socket.on

socket.on('createRoom', function(roomName) {
  socket.join('Room 1');
  console.log(io.sockets.adapter);
  console.log(io.sockets.adapter.rooms);
  let clients = io.sockets.adapter.rooms['Room 1'].sockets;
  console.log('A user joined the room with the name: ' + roomName + ". The user's name is " + raceResponse.user_name);
  console.log(clients);
  socket.emit('roomCreated', clients);
});

从那以后,我更改了此名称,以在服务器端定义房间名称,因为出现错误:

let clients = io.sockets.adapter.rooms['Room 1'].sockets;
TypeError: Cannot read property 'sockets' of undefined

但是请注意上面的io.sockets.adapter行:它们记录了io.sockets.adapterio.sockets.adapter.rooms 我相信后者是所有房间的清单,因为它给了我:

{ ZJ81Hw0FkCIQxg86AAAA: [], UoE9k4lTnGMUB9y6AAAB: [], 'Y-Tr2j9MxCzZokSSAAAC': [ 'Y-Tr2j9MxCzZokSSAAAC': true ] }

在我看来,该对象中的第一个项目是默认房间,另一个项目是刚创建的房间,其中有一个用户。让我感到困惑的是,该房间未称为“房间1”。 ”,这是我期望的。

我可能完全误解了io.sockets.adapter.rooms意思,因此,请告诉我。

io.sockets.adapter给了我:

Adapter {
  nsp: Namespace {
    name: '/',
    server: Server {
      nsps: [Object],
      _path: '/socket.io',
      _serveClient: true,
      _adapter: [Function: Adapter],
      _origins: '*:*',
      sockets: [Circular],
      eio: [Server],
      httpServer: [Server],
      engine: [Server]
    },
    sockets: [ [Socket] ],
    connected: { wKTl5kLVfhWSTSt0AAAB: [Socket] },
    fns: [],
    ids: 0,
    acks: {},
    adapter: [Circular]
  },
  rooms: {
    '-zzOKEUrvDOj_345AAAA': [],
    wKTl5kLVfhWSTSt0AAAB: [ wKTl5kLVfhWSTSt0AAAB: true ]
  },
  sids: { wKTl5kLVfhWSTSt0AAAB: { wKTl5kLVfhWSTSt0AAAB: true } },
  encoder: Encoder {}
}
{
  '-zzOKEUrvDOj_345AAAA': [],
  wKTl5kLVfhWSTSt0AAAB: [ wKTl5kLVfhWSTSt0AAAB: true ]
}

任何人都可以提供任何解释或替代方法吗? 将不胜感激。

不知道您的Socket-io版本,但是服务器的设置如下:

let io = require('socket.io');

io.on('connection', function(socket){
    socket.join('Test');
    socket.join('Test1');
    console.log(io.sockets.adapter.rooms);
});

客户端设置如下:

let io = require('socket.io-client');

socket = io.connect("http://localhost:8090")

我从Nodejs v8.9.3 / Socket.io v2.2.0上的服务器获得的结果是:

{
    c9kG4WD5hFlLUOZrAAAA: Room { sockets: { c9kG4WD5hFlLUOZrAAAA: true }, length: 1 },
    Test: Room { sockets: { c9kG4WD5hFlLUOZrAAAA: true }, length: 1 },
    Test2: Room { sockets: { c9kG4WD5hFlLUOZrAAAA: true }, length: 1 }
}

深入研究Socket.IO文档,我找到了对一种方法的引用,该方法显示了套接字所在的所有房间并进行了测试:

let rooms = Object.keys(io.sockets.adapter.rooms);
console.log(rooms);

哪个返回:

[ 'c9kG4WD5hFlLUOZrAAAA', 'Test', 'Test2' ]

仅按名称列出所有当前存在的房间。

我通过以下方式对此进行了改进:

let roomName = rooms[rooms.length-1]; //Get last room pushed
console.log('A user joined the room with the name: ' + roomName + ". The user's name is X");

哪个返回:

"A user joined the room with the name: Room 1. The user's name is X"

您可以自己以阵列形式跟踪房间的名称,但是您要小心一些,因为这可能会导致潜在的内存泄漏。

但是,如果您想要的只是最后一个加入的房间,则可以将任何值用作var并将其传递给emit。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM