【发布时间】:2016-04-04 14:35:05
【问题描述】:
向特定房间in Socket.io according to the docs 发送消息的方式似乎非常简单。下面的代码是一个处理程序,是一个更大模块的一部分,但功能都应该很简单,特别是因为我展示了暴露每个变量代表什么的日志:
module.exports.handle = function(client, data, socket, sessions, callback) {
debug.log('Client, ' + data.name + ' sent message:' + data.message);
debug.log(JSON.stringify(data, null, 3));
var sessionId = data.code;
var name = data.name;
var room = JSON.stringify(socket.sockets.adapter.rooms[sessionId]);
debug.log('Socket.io Room: ' + room);
socket.to(sessionId).emit('receive message', {
name : data.name,
message : data.message,
sender : client.id
});
};
以下日志(基于前面的代码)清楚地表明我指定的房间是一个有效的 Socket.io 房间,所以我不明白为什么(在这种情况下).to('M57VUYD1') 无法将消息发送到房间。在这种情况下,日志似乎验证了M57VUYD1 是一个有效的房间。
[Debug][Send Message Event Handler]: Client, Jonathan sent message:hey
[Debug][Send Message Event Handler]: {
"message": "hey",
"name": "Jonathan",
"code": "M57VUYD1"
}
[Debug][Send Message Event Handler]: Socket.io Room: {"sockets":{"57VUYD1":true,"D4N178C":true},"length":2}
此模块是否有问题,无法按预期工作?还是我使用了正确的语法?
我在全球范围内发送这些消息(非基于房间)并且客户端完美地接收了这些消息,所以我认为我的客户端套接字事件侦听器没有问题。它似乎不是我加入房间的模块,因为日志显示两个客户端是房间的成员,因为它们应该在 Socket.io 的房间数据结构中。
我在 GitHub 上更详细地添加了这个问题:https://github.com/socketio/socket.io/issues/2518
【问题讨论】:
-
为了不被房间名
M57VUYD1和socket ID57VUYD1的相似性弄糊涂,我解释一下:57VUYD1是我为恰好有的用户定义的ID创建了房间,我用创建者的 ID 命名了房间,除了前面的字母“M”(因为你不能用与一个人相同的 ID 命名房间,因为 Socket.io 向特定用户发送消息的默认方法有效通过让所有用户以他们自己的名字加入一个新房间,然后使用.to()方法将消息发送到该房间的语法。) -
还要澄清由于变量名称偏好引起的潜在混淆:
socket是我注意到其他人命名为“io”的名称,client是其他人所说的“套接字”。这就是为什么即使在个人项目中我也应该按照标准格式命名。我现在就进去改一下来解决这个问题,但我不想弄乱当前正在写的任何答案。
标签: javascript socket.io