繁体   English   中英

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

[英]Is my code for sending Socket.io messages to a specific room wrong?

当用户加入时,我将其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事件在服务器端发出并在客户端被侦听,但是没有消息通过。 因此,我假设我在处理房间时做错了什么,但我不知道这可能是什么。

我做房间创建/发射错误吗? 还是应该在其他地方寻找问题?

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

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

应该只是:

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

暂无
暂无

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

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