![](/img/trans.png)
[英]Why are my messages not sending to the Socket.io room with this handler?
[英]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.