【问题标题】:Is my code for sending Socket.io messages to a specific room wrong?我将 Socket.io 消息发送到特定房间的代码是否错误?
【发布时间】:2016-03-05 01:11:27
【问题描述】:

当用户加入时,我将他的 ID 更改为更短的随机代码。这是为了使用 id 作为前端可见的会话 ID,我提到这一点只是因为否则您可能会混淆为什么我的套接字 ID 不是标准的,甚至可能与问题有关。

然后以该代码/ID 作为其名称创建一个房间,这是来自会话创建事件套接字处理程序的相关代码,其中 client 是大多数人所说的 socketsocket 是大多数人所说的io,我只是给它们起了不同的名字,所以希望到目前为止很清楚:

var sessionId = client.id;
debug.log('Session ID: ' + sessionId);
debug.log('Data: ' + JSON.stringify(data, null, 3));
debug.log(JSON.stringify(socket.sockets.adapter.rooms));
client.join(sessionId);
debug.log(JSON.stringify(socket.sockets.adapter.rooms));
callback(sessions[sessionId]);

因此,此时,我们通过查看socket.sockets.adapter.rooms 对象(一个显示在加入房间之前,另一个显示在之后),得到一个日志,表明客户端是新套接字房间的成员:

[Debug][Create Session Event Handler]: Session ID: QXVLSLE
[Debug][Create Session Event Handler]: Data: {
   "name": "Jonathan"
}
[Debug][Create Session Event Handler]: {"/#0JCm5cyTpqTkXTIoAAAA":{"sockets":
{"/#0JCm5cyTpqTkXTIoAAAA":true},"length":1},"/#pqG0tzoc4i7xg8ygAAAB":{"sockets":
{"/#pqG0tzoc4i7xg8ygAAAB":true},"length":1},"/#R9HQ2k6cOqF_bodmAAAC":{"sockets":
{"/#R9HQ2k6cOqF_bodmAAAC":true},"length":1}}
[Debug][Create Session Event Handler]: {"/#0JCm5cyTpqTkXTIoAAAA":{"sockets":
{"/#0JCm5cyTpqTkXTIoAAAA":true},"length":1},"/#pqG0tzoc4i7xg8ygAAAB":{"sockets":
{"/#pqG0tzoc4i7xg8ygAAAB":true},"length":1},"/#R9HQ2k6cOqF_bodmAAAC":{"sockets":
{"/#R9HQ2k6cOqF_bodmAAAC":true},"length":1},"QXVLSLE":{"sockets":
{"QXVLSLE":true},"length":1}}

从这里开始,我将把之前的日志缩短到最后的相关信息:

"QXVLSLE":{"sockets":
    {"QXVLSLE":true},"length":1}}

接下来我们有第二个客户希望加入会话/房间的套接字事件的处理程序:

debug.log('Client Joining Session: ' + sessionId);
sessions[sessionId].clients[client.id] = {
    name : name,
    id : client.id
};
debug.log(JSON.stringify(socket.sockets.adapter.rooms));
client.join(sessionId);
debug.log(JSON.stringify(socket.sockets.adapter.rooms));

然后是显示客户端加入房间的日志,以及之前和之后的socket.sockets.adapter.rooms对象,显示新客户端成功加入房间:

[Debug][Join Session Event Handler]: Client Joining Session: QXVLSLE
[Debug][Join Session Event Handler]: {"QXVLSLE":{"sockets":
{"QXVLSLE":true},"length":1}
[Debug][Join Session Event Handler]: {"QXVLSLE":{"sockets":
{"QXVLSLE":true,"L1FFBDU":true},"length":2}

所以这似乎工作正常,但是现在,我希望以下代码向房间内的客户发送消息,但它没有发生:

socket.to(sessionId).emit('receive message', {
    name : data.name,
    message : data.message
});

为了确保这段代码正在运行,我看到了日志,而且会话 ID 似乎是正确的,日志也在那里匹配。 receive message 事件正在服务器端发出并在客户端进行侦听,但没有消息通过。所以我假设我在房间处理方面做错了什么,但我不知道它可能是什么。

我做错房间创建/发射吗?还是我应该在别处寻找问题?

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

    哇,好吧,我想通了。我的代码处理房间确实有问题:

    socket.to(sessionId).emit('receive message', {
        name : data.name,
        message : data.message
    });
    

    应该是:

    socket.emit('receive message', {
        name : data.name,
        message : data.message
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-06
      • 2016-11-04
      • 2023-03-27
      • 1970-01-01
      • 2019-03-12
      • 2017-09-27
      • 1970-01-01
      • 2021-09-04
      相关资源
      最近更新 更多