我的Socket.io消息发送到特定房间的代码是错误的吗?

时间:2016-03-03 23:43:20

标签: javascript node.js socket.io

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

然后创建一个以该代码/ id作为名称的房间,这里是会话创建事件套接字处理程序中的相关代码,其中client是大多数人称之为socket和{{1}的内容是大多数人称之为socket的,我只是以不同的方式命名,所以希望到目前为止很清楚:

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]); 对象(一个在加入房间之前显示,另一个在之后显示)显示客户端是新套接字室的成员:< / p>

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}}

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

"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}

确保此代码正在运行,我看到日志,会话ID似乎正确,日志也匹配。 socket.to(sessionId).emit('receive message', { name : data.name, message : data.message }); 事件正在服务器端发出并在客户端进行侦听,但没有消息通过。所以我假设我在房间处理方面做错了,但我不知道它可能是什么。

我在做房间创作/发射错了吗?或者我应该到别处寻找问题?

1 个答案:

答案 0 :(得分:0)

哇,好吧,我想出来了。处理房间的代码确实存在问题:

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

应该只是:

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