将消息发送到特定房间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
答案 0 :(得分:4)
答案是这样的:改变Socket.io中的套接字ID,就像我在Stack Overflow上学到的那样,你可以做的事情,但我没有意识到的是这样做会破坏未知的Socket.io方式即可。其中一种方法是:房间系统将不再有效。
换句话说,不要将套接字ID更改为您自己选择的套接字ID,否则库不支持。
答案 1 :(得分:0)
根据你所说的,包括所有的重命名(这使得它更难猜),你似乎有2个连接:57VUYD1
似乎是服务器,{{1}我猜的是客户端。因此,尝试连接D4N178C
不会有太大作用。
尝试发送到客户端的地址:
M57VUYD1
可能是socket.to('D4N178C').emit('receive message', {
name : data.name,
message : data.message,
sender : client.id
});
而不是57VUYD1
,因为我不确定你是如何定义的。
我也不确定您分配的哪个变量会让您获得D4N178C
,但您可以将其替换为上述D4N178C
中的任何作品并且应该有效。