【发布时间】:2016-03-05 01:11:27
【问题描述】:
当用户加入时,我将他的 ID 更改为更短的随机代码。这是为了使用 id 作为前端可见的会话 ID,我提到这一点只是因为否则您可能会混淆为什么我的套接字 ID 不是标准的,甚至可能与问题有关。
然后以该代码/ID 作为其名称创建一个房间,这是来自会话创建事件套接字处理程序的相关代码,其中 client 是大多数人所说的 socket 和 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]);
因此,此时,我们通过查看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