将消息发送到特定房间的方法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}
该模块无法正常工作,是否存在问题?还是我使用了正确的语法?
我正在全局发送这些消息(非基于房间),并且客户端正在完美地接收消息,因此我认为客户端套接字事件侦听器没有问题。它似乎不是我加入 session 室的模块,因为日志显示两个客户端是 session 室的成员,因为它们应该在Socket.io的 session 室数据结构中。
我在GitHub上更详细地添加了此问题:https://github.com/socketio/socket.io/issues/2518
最佳答案
答案是这样的:正如我在Stack Overflow上了解到的那样,更改Socket.io中的套接字ID是可以做的,但是我没有意识到这样做会以未知的方式破坏Socket.io 。这些方法之一是:房间系统将不再起作用。
换句话说,不要将套接字ID更改为您自己选择的套接字,库不支持这样做。